技术分享 || Mysql中IS NULL、IS NOT NULL不能走索引?

在 MySQL 中,ISNULL 和 ISNOTNULL 并未完全禁用索引。
我给你做了个实验,你看一下。

首先创建一个名为user_info的表。
字段包括 ID、姓名、年龄和地址。
索引名称和地址。

实验数据准备
数据1 : 插入一组记录。
大多数记录的名称为空,但有些记录的名称不为空。
SQL -
插入大量名称为空的记录 INSERT INTO user_info (name,age,address) VALUES (null, 2 0, 'addr1 ') 重复 1 0000 次; -
插入少量名称不为NULL的记录 INSERT INTO user_info (姓名、年龄、地址) VALUES ('Alice', 2 5 , 'addr2 ') 重复 1 00 次;
数据2 : 相反,不为 NULL 的名称较多,为 NULL 的名称较少。
SQL -
插入大量名称不为NULL的记录 INSERT INTO user_info(name,age,address) VALUES('Bob', 3 0, 'addr3 ') 重复 1 0000 次; -
插入少量名称为零的记录 INSERT INTO user_info(姓名、年龄、地址) VALUES(NULL, 3 5 , 'addr4 ') 重复 1 00 次;
解释
执行数据1 : SQL 指定 select from user_info where name 不为空; 从 user_info WHERE name != '9 ' 中清除 SELECT; CLEAR SELECT FROM user_info WHERE name IS NULL;
结果:
第一个和第二个使用 SQL 索引。

不使用第三个索引
数据2 : SQL 指定 select from user_info where name 不为空; 从 user_info WHERE name != '9 ' 中清除 SELECT; CLEAR SELECT FROM user_info WHERE name IS NULL;
结果:
第三个使用 SQL 索引。

第一个和第二个没有索引
B+树数据排列规则
聚集索引:
页面上的记录按主键排序
B+树的每一层节点都按照页面中记录的主键值进行排序。

叶子节点存储完整的用户记录
二级索引:
页面中的记录按照索引列值排序
B+树各层节点按照索引列值排序。

叶子节点存储索引列值+主键值
二级索引值可以为空
NULL值在最左边,因为NULL是列中最小值
索引无效的原因
比较数据1 和数据2 :
在数据1 中,有很多零值。
ISNOTNULL 和 != 有索引,但 ISNULL 没有索引。

数据2 中存在一些NULL值,索引中使用了ISNULL,不使用ISNOTNULL和!=
索引扫描成本包括: 1 、读取索引记录的成本 2 、双重检查主键索引,找出整个数据成本(表返回)
如果查询读取多个二级索引,需要多次返回表,达到一定比例时就会扫描全表。
这就是为什么索引有时在NULL查询期间不起作用的原因。

MySQL决定是否使用索引的依据
MySQL使用代价来决定是否使用索引,而不是WHERE子句中的ISNULL、ISNOTNULL、!=等条件。

当 LIKE '%string%' AND 时索引完成'string%'
正常情况下,LIKE %%和%不会被索引,但也不是不可能。
例如,在姓名和年龄上创建复合索引后: SQL 解释从 user_info 中选择名称,其中名称类似于“%a%”; 解释 select name,age from user_info where name is like '%a%';
这两个都将被索引。

SQL 解释一下 select name,age,address from user_info where name is like '%a%'; EXPLAIN select from user_info where name is like '%a%';
这两者都会导致全表扫描,因为查询不在复合索引中的列。

所以LIKE能否用在索引中并不是绝对的,要看使用条件。

如何查表是否有索引 sqlserver

表 pi_content 具有字段 [piid]int、[seqnum]int、[phname]nvarchar(5 0)、[content]nvarchar(MAX)。
数据量确实很大,有几百万。

然后启动 SQL SERVER 2 008 并登录。

然后在 SQL SERVER 2 008 R2 中单击“新建查询”以打开查询分析器。
写一条SQL语句,比如检查数据什么的,然后点击“执行”。
此时,如果返回SQL SERVER PROFILER,就可以看到刚才的SQL语句使用了多长时间。

返回到查询分析器,现在选择 SQL 语句,单击鼠标右键,然后单击“在数据库引擎优化顾问中分析查询”。

然后点击左上角的“连接”,会打开一个登录窗口,填写数据库参数后点击“连接”。

这样查询索引优化就完成了。
说实话,当时我不太明白为什么要连接这一堆,但跑起来肯定是这样的。