文章插图
- ALL,全表扫描,不通过索引树,因为这次是 select * 查询
文章插图
6、possible_keys
MySQL 分析此次查询可能会用到的索引,但是实际查询中不一定会用到
文章插图
分析可能会用到 idx_name 这个索引,实际查询中没有用到索引,走的全表扫描
7、key
查询时真正用到的 key
文章插图
查询中实际上用到了 idx_name 这个索引
8、ken_len
表示查询用到的索引列长度
文章插图
我们用这个索引来分析,key_len 为 63 是怎么来的?
文章插图
创建 user 表的时候,不知道大家有没有注意到,name 的字符集为 utf8
MySQL 5.0 版本以上,utf8 字符集下每个字符占用 3 个字节,varchar(20) 则占用 60 个字节,同时因为 varchar 是变长字符串,需要额外地字节存放字符长度,共两个字节,此外,name 字段可以为 null 值,null 值单独占用一个字节,加在一起一共 63 个字节
9、ref
当使用索引列等值匹配的条件去执行查询时,也就是在访问方法是
const
、eq_ref
、ref
、ref_or_null
、unique_subquery
、index_subquery
其中之一时,ref
列展示的就是与索引列作等值匹配的具体信息,比如只是一个常数或者是某个列 。文章插图
10、rows
预计需要扫描的函数
11、filtered
filtered 这个是一个百分比的值,表里符合条件的记录数的百分比 。简单点说,这个字段表示存储引擎返回的数据在经过过滤后,剩下满足条件的记录数量的比例 。
12、Extra
Extra
是用来说明一些额信息的,从而帮助我们更加准确的理解查询5.3高性能 的索引使用策略5.3.1 不要在索引列上做任何操作
explain select * from user where left(name,2) = '小芳';
文章插图
这段 sql 对 name 字段做了函数操作,导致索引失效
5.3.2 最左前缀法则在使用联合索引查询时,应该遵循最左前缀原则,指的是查询从索引的最左前列开始并且不跳过索引中的列 。
创建一张 goods 表,有一个联合索引包含了 name,price、mark 三个字段
DROP TABLE IF EXISTS `goods`;CREATE TABLE `goods`(`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`price` int(10) NULL DEFAULT NULL,`mark` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,INDEX `idx_all`(`name`, `price`, `mark`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ------------------------------ Records of goods-- ----------------------------INSERT INTO `goods` VALUES (1, '手机', 5678, '华为手机');INSERT INTO `goods` VALUES (2, '电脑', 9888, '苹果电脑');INSERT INTO `goods` VALUES (3, '衣服', 199, '好看的衣服');
执行下面的查询语句:explain select * from goods where name = '手机' and price = 5678 and mark = '华为手机';
经验总结扩展阅读
- 如何优雅的备份MySQL数据?看这篇文章就够了
- 【博学谷学习记录】超强总结,用心分享|MySql连接查询超详细总结
- 一文讲清楚 JVM Safe Point
- day08-MySQL事务
- MySQL 窗口函数
- 线上服务宕机,码农试用期被毕业,原因竟是给MySQL加个字段
- mac通过docker一键部署MySQL8
- day07-2MySQL索引
- CentOS部署MySQL
- MySQL用户也可以是个角色