null和not null索引失效与否主要与表中字段的设立有关系,分为相应的两种情况,当对不能是null的字段使用索引时,条件无论是null或者not null 索引都失效,当对能是null的字段使用索引时,条件无论是null或者not null 索引都生效. 以下是null字段走索引的一个例子: (root@localhost)-[09:51:01]-[(none)]>create database test; Query OK, 1 row affected (0.02 sec) (root@localhost)-[09:51:09]-[(none)]>CREATE TABLE `test_null` ( -> `id` int(11) DEFAULT NULL, -> `mark` varchar(20) DEFAULT NULL -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; (root@localhost)-[09:51:26]-[(none)]>use test Database changed (root@localhost)-[09:51:27]-[test]>CREATE TABLE `test_null` ( -> `id` int(11) DEFAULT NULL, -> `mark` varchar(20) DEFAULT NULL -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.37 sec) (root@localhost)-[09:51:29]-[test]>delimiter // (root@localhost)-[09:51:37]-[test]>DROP PROCEDURE IF EXISTS test_null; -> create procedure test_null(in num int) -> BEGIN -> DECLARE i int; -> set i=1; -> while (i<num) -> DO -> if mod(i,10)!=0 then -> insert into test_null values (i,concat('aaa',i)); -> else -> insert into test_null values (null,concat('aaa',i)); -> end if; -> set i=i+1; -> END while; -> END; -> // Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.00 sec) (root@localhost)-[09:51:38]-[test]>delimiter ; (root@localhost)-[09:51:44]-[test]>call test_null(10000); Query OK, 1 row affected (12.34 sec) (root@localhost)-[09:52:03]-[test]> (root@localhost)-[09:52:03]-[test]> (root@localhost)-[09:52:03]-[test]> (root@localhost)-[09:52:03]-[test]> (root@localhost)-[09:52:03]-[test]> (root@localhost)-[09:52:03]-[test]>select count(*) from test_null; +----------+ | count(*) | +----------+ | 9999 | +----------+ 1 row in set (0.00 sec) (root@localhost)-[09:52:24]-[test]>explain SELECT * from test_null WHERE id is null; +----+-------------+-----------+------------+------+---------------+------+---------+------+-------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+------+---------+------+-------+----------+-------------+ | 1 | SIMPLE | test_null | NULL | ALL | NULL | NULL | NULL | NULL | 10003 | 10.00 | Using where | +----+-------------+-----------+------------+------+---------------+------+---------+------+-------+----------+-------------+ 1 row in set, 1 warning (0.00 sec) (root@localhost)-[09:52:34]-[test]>create index idx_test_null on test_null(id); Query OK, 0 rows affected (0.13 sec) Records: 0 Duplicates: 0 Warnings: 0 (root@localhost)-[09:52:46]-[test]>explain SELECT * from test_null WHERE id is null; +----+-------------+-----------+------------+------+---------------+---------------+---------+-------+------+----------+-----------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+---------------+---------+-------+------+----------+-----------------------+ | 1 | SIMPLE | test_null | NULL | ref | idx_test_null | idx_test_null | 5 | const | 999 | 100.00 | Using index condition | +----+-------------+-----------+------------+------+---------------+---------------+---------+-------+------+----------+-----------------------+ 1 row in set, 1 warning (0.00 sec) (root@localhost)-[09:52:54]-[test]> (root@localhost)-[09:52:54]-[test]>explain SELECT * from test_null WHERE id is not null; +----+-------------+-----------+------------+------+---------------+------+---------+------+-------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+------+---------+------+-------+----------+-------------+ | 1 | SIMPLE | test_null | NULL | ALL | idx_test_null | NULL | NULL | NULL | 10003 | 89.97 | Using where | +----+-------------+-----------+------------+------+---------------+------+---------+------+-------+----------+-------------+ 1 row in set, 1 warning (0.00 sec) 建议: MySQL列中尽量避免NULL,应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化。因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。
MySQL null值字段是否使用索引的总结
来源:这里教程网
时间:2026-03-01 11:46:50
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- MySQL:show slave status 关键值和MGRrelay log的清理策略
- sysbench花式采坑之二:自增值导致的主键冲突
sysbench花式采坑之二:自增值导致的主键冲突
26-03-01 - 牛逼了,史上 MySQL 最全优化指南,快收藏起来!
牛逼了,史上 MySQL 最全优化指南,快收藏起来!
26-03-01 - Mysql连接错误ERROR 2003 (HY000)
Mysql连接错误ERROR 2003 (HY000)
26-03-01 - 复制错误案例分享(一)
复制错误案例分享(一)
26-03-01 - 当我们输入一条 SQL 查询语句时,发生了什么?
当我们输入一条 SQL 查询语句时,发生了什么?
26-03-01 - 复制错误案例分享(二)
复制错误案例分享(二)
26-03-01 - 填坑利器?Redis如何弥补传统MySQL架构的不足。
填坑利器?Redis如何弥补传统MySQL架构的不足。
26-03-01 - 这一次,带你搞清楚MySQL的事务隔离级别!
这一次,带你搞清楚MySQL的事务隔离级别!
26-03-01 - 【Django青铜修炼手册】django+mysql的使用
【Django青铜修炼手册】django+mysql的使用
26-03-01
