explain输出内容解析--type
1.依次从好到坏
system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL
除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引
2.type
(1).system
表中只有一行数据或者是空表。
无法复现
(2).const(重要)
使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type是const。其他数据库
也叫做唯一索引扫描
(3).eq_ref(重要)
关键字:连接字段主键或者唯一性索引。
此类型通常出现在多表的 join 查询, 表示对于前表的每一个结果, 都只能匹配到后表的一行结果. 并且查询的比较操作通常是 '=', 查询效率较高
(4).ref(重要)
针对非唯一性索引,使用等值(=)查询非主键。或者是使用了最左前缀规则索引的查询。
不管两张表abc是什么类型的索引只要是非主键连接 打印出的索引类型都是ref
最左前缀原则
(5)ref_or_null
与ref方法类似,只是增加了null值的比较。实际用的不多。
(6)unique_subquery
用于where中的in形式子查询,子查询返回不重复值唯一值
(7)index_subquery
用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重。
(8)range(重要)
索引范围扫描,常见于使用>,<,is null,between ,in ,like等运算符的查询中。
name使用索引
abc不使用索引
(9)index_merge
表示查询使用了两个以上的索引,最后取交集或者并集,常见and ,or的条件使用了不同的索引,官方
排序这个在ref_or_null之后,但是实际上由于要读取所个索引,性能可能大部分时间都不如range。
(10)index(重要)
关键字:条件是出现在索引树中的节点的。可能没有完全匹配索引。
索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。
单索引:
组合索引:
(11)all(重要)
这个就是全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录。
主键不要uuid
why? 无序、辅助索引要存 太长
主键: 自增
分布式主键: 雪花算法(sharding jdbc)、 redis生成
上一篇下一篇