MySQL 索引的一些细节分享

 更新时间:2020年12月28日 09:32:29   作者:Nicksxs  
这篇文章主要介绍了MySQL 索引的一些细节分享,帮助大家更好的理解和使用MySQL中的索引,感兴趣的朋友可以了解下

前几天同事问了我个 mysql 索引的问题,虽然大概知道,但是还是想来实践下,就是 is null,is not null 这类查询是否能用索引,可能之前有些网上的文章说都是不能用索引,但是其实不是,我们来看个小试验

CREATE TABLE `null_index_t` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `null_key` varchar(255) DEFAULT NULL,
 `null_key1` varchar(255) DEFAULT NULL,
 `null_key2` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_1` (`null_key`) USING BTREE,
 KEY `idx_2` (`null_key1`) USING BTREE,
 KEY `idx_3` (`null_key2`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

用个存储过程来插入数据

delimiter $	#以delimiter来标记用$表示存储过程结束
create procedure nullIndex1()
begin
declare i int;	
declare j int;	
set i=1;
set j=1;
while(i<=100) do	
	while(j<=100) do	
		IF (i % 3 = 0) THEN
	   INSERT INTO null_index_t ( `null_key`, `null_key1`, `null_key2` ) VALUES (null , LEFT(MD5(RAND()), 8), LEFT(MD5(RAND()), 8));
  ELSEIF (i % 3 = 1) THEN
			 INSERT INTO null_index_t ( `null_key`, `null_key1`, `null_key2` ) VALUES (LEFT(MD5(RAND()), 8), NULL, LEFT(MD5(RAND()), 8));
	 ELSE
			 INSERT INTO null_index_t ( `null_key`, `null_key1`, `null_key2` ) VALUES (LEFT(MD5(RAND()), 8), LEFT(MD5(RAND()), 8), NULL);
  END IF;
		set j=j+1;
	end while;
	set i=i+1;
	set j=1;	
end while;
end 
$
call nullIndex1();

然后看下我们的 is null 查询

EXPLAIN select * from null_index_t WHERE null_key is null;

再来看看另一个

EXPLAIN select * from null_index_t WHERE null_key is not null;

从这里能看出来啥呢,可以思考下

从上面可以发现,is null应该是用上了索引了,所以至少不是一刀切不能用,但是看着is not null好像不太行额
我们在做一点小改动,把这个表里的数据改成 9100 条是 null,剩下 900 条是有值的,然后再执行下

然后再来看看执行结果

EXPLAIN select * from null_index_t WHERE null_key is null;

EXPLAIN select * from null_index_t WHERE null_key is not null;

是不是不一样了,这里再补充下我试验使用的 mysql 是 5.7 的,不保证在其他版本的一致性,
其实可以看出随着数据量的变化,mysql 会不会使用索引是会变化的,不是说 is not null 一定会使用,也不是一定不会使用,而是优化器会根据查询成本做个预判,这个预判尽可能会减小查询成本,主要包括回表啥的,但是也不一定完全准确。

以上就是MySQL 索引的一些细节分享的详细内容,更多关于MySQL 索引的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL Order by 语句用法与优化详解

    MySQL Order by 语句用法与优化详解

    Order by语句是用来排序的,经常我们会使用到Order by来进行排序,下面我给大家来讲讲Order by用法与优化排序,有需要的同学可参考
    2013-06-06
  • 彻底搞懂数据库操作truncate delete drop关键词的区别

    彻底搞懂数据库操作truncate delete drop关键词的区别

    这篇文章主要为大家介绍了数据库操作truncate delete drop关键词的区别,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • MySQL长连接短连接面试精讲

    MySQL长连接短连接面试精讲

    这篇文章主要为大家介绍了MySQL长连接短连接面试精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 关于Mysql自增id的这些你可能还不知道

    关于Mysql自增id的这些你可能还不知道

    这篇文章主要给大家介绍了关于Mysql自增id的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • 用命令创建MySQL数据库(de1)的方法

    用命令创建MySQL数据库(de1)的方法

    下面小编就为大家带来一篇用命令创建MySQL数据库(de1)的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • MySQL的意向共享锁、意向排它锁和死锁

    MySQL的意向共享锁、意向排它锁和死锁

    这篇文章主要介绍了MySQL的意向共享锁、意向排它锁和死锁,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • MySQL 集群迁移到 Kubernetes操作步骤

    MySQL 集群迁移到 Kubernetes操作步骤

    这篇文章主要为大家介绍了MySQL 集群迁移到 Kubernetes使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • MYSQL替换时间(年月日)字段时分秒不变实例解析

    MYSQL替换时间(年月日)字段时分秒不变实例解析

    这篇文章主要介绍了MYSQL替换时间(年月日)字段,时分秒不变的实现方法,需要的朋友可以参考下
    2017-07-07
  • 往MySQL中存储图片的方法

    往MySQL中存储图片的方法

    这篇文章主要介绍了往MySQL中存储图片的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • MySQL内存使用之线程独享介绍

    MySQL内存使用之线程独享介绍

    这篇文章主要介绍了MySQL内存使用之线程独享介绍,线程独享内存主要用于各客户端连接线程存储各种操作的独享数据,如线程栈信息,分组排序操作,数据读写缓冲,结果集暂存等等,而且大多数可以通过相关参数来控制内存的使用量,需要的朋友可以参考下
    2014-12-12

最新评论