终于有人将mysql 索引讲清楚了(MySQL 索引的一些细节分享)
类别:数据库 浏览量:123
时间:2022-01-23 02:47:13 终于有人将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 索引的资料请关注开心学习网其它相关文章!
原文链接:https://nicksxs.me/2020/12/27/%E8%81%8A%E8%81%8A-mysql-%E7%B4%A2%E5%BC%95%E7%9A%84%E4%B8%80%E4%BA%9B%E7%BB%86%E8%8A%82/
您可能感兴趣
- laravel数据表配置(laravel实现按月或天或小时统计mysql数据的方法)
- mysql实用教程(Mysql调优Explain工具详解及实战演练推荐)
- mysql的默认事务隔离级别(啥是 MySQL 事务隔离级别?)
- mysql8.0.18.0安装详细教程(mysql 8.0.22 下载安装配置方法图文教程)
- mysql新增字段语句(关于Mysql update修改多个字段and的语法问题详析)
- mysql数据库导入错误怎么处理(MySQL数据库导入导出数据之报错解答实例讲解)
- mysql添加注释视图(mysql创建表添加字段注释的实现方法)
- mysql 自定义排序
- mysql自增长语句(mysql实现自增序列的示例代码)
- mysql mvcc 流程(Mysql MVCC机制原理详解)
- php实现redis核心代码(PHP结合Redis+MySQL实现冷热数据交换应用案例详解)
- mysql数据库使用规则(mysql数据库基本语法及操作大全)
- mysql千万数据如何优化(MySQL千万级数据的表如何优化)
- mysql数值类型图解(详解mysql持久化统计信息)
- python 数据库实现学生管理系统(python+mysql实现教务管理系统)
- mysql基础操作报告(gorm操作MySql数据库的方法)
- 越南没事(越南没事情做)
- 重庆旅游攻略(重庆旅游3-4天攻略最佳线路)
- 周杰伦演唱会门票(周杰伦演唱会门票多少钱一张2023)
- 焕然一新 成都轨道集团官方网站改版上线(成都轨道集团官方网站改版上线)
- 成都轨道交通19号线二期全线电通(成都轨道交通19号线二期全线电通)
- 19号线二期全线电通 轨道交通项目最新进展来了(19号线二期全线电通)
热门推荐
- 织梦dedecms建站教程(详解DEDECMS织梦模板随机调用文章数据方法汇总教程)
- contenttype类型
- computer browser服务启动后停止(用户IIS APPPOOLDefaultAppPool登录失败的解决方法)
- mysql 用户权限配置(详解MySQL 用户权限管理)
- django请求流程(Django学习笔记之为Model添加Action)
- 怎么将mysql彻底卸载(如何把Mysql卸载干净亲测有效)
- php 策略模式工厂模式区别(PHP设计模式之策略模式原理与用法实例分析)
- php考试复习题(php+mysql开发的最简单在线题库在线做题系统完整案例)
- php怎么设计策略模式(php设计模式之策略模式应用案例详解)
- ExtJs中Store的种类
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9