mysql创建索引 MySQL索引优化分析( 五 )


全部:(全表扫描)无疑是最差的,如果数据量是几千万,全表扫描会很慢。
索引:(全索引扫描)全索引文件扫描比全部好很多。毕竟,从索引树中查找数据比从整个表中查找数据要快。
范围:只检索给定范围内的行,并使用索引来匹配这些行。范围缩小,比全表扫描和全索引文件扫描快。通常有介于,in,>:,& lt等待询问。
非唯一索引扫描本质上是一种索引访问,它返回匹配单个值的所有行。例如,如果您查询公司中属于R&D团队的所有同事,匹配结果是多个非唯一值。
Eq_ref:唯一索引扫描。对于每个索引键,表中都有一条与之匹配的记录。比如查询一家公司的CEO,匹配结果只能是一条记录。
Const:表示索引一次就能找到。const用于比较主键或唯一索引。因为只有一行数据匹配,如果主键放在where列表中,MySQL可以快速将查询转换为常量。
系统:表中只有一条记录(等于系统表)。这是const类型的特殊列,平时不会出现。理解就好。
可能的键(_ k)
显示查询语句可能使用的索引(一个或多个或空),这些索引可能实际上没有被查询使用。仅供参考。
钥匙
显示查询语句实际使用的索引。如果为空,则不使用该索引。
key_len
显示索引中使用的字节数,查询中使用的索引长度可以由key_len计算。索引长度越短,在不损失准确性的情况下越好。key_len显示的值是索引字段最可能的长度,而不是实际长度,即key_len是根据表定义计算的,而不是从表中检索的。
裁判
显示索引的哪一列或常数用于查找索引列上的值。

根据表的统计信息和索引的选择,粗略估计出查找所需记录需要读取的行数。数值越大越不好。
额外的
使用文件排序:这意味着MySQL将根据外部索引对数据进行排序,而不是根据表中的索引顺序读取数据。MySQL中不能用索引完成的排序操作称为“文件排序”。发生这种情况时,您应该立即优化sql。
使用临时表:临时表用于保存中间结果,MySQL在对查询结果排序时使用临时表。常用于排序依据和分组查询依据。发生这种情况时,您应该立即优化sql。
使用索引:指示相应的选择操作使用覆盖索引,这避免了访问表的数据行。效果不错!如果“使用位置”同时出现,则表示该索引用于查找索引的键值。如果“使用位置”没有同时出现,则意味着该索引用于读取数据,而不是执行查找操作。
覆盖索引(Covering Index):也称为索引覆盖,即select的数据列只能从索引中获取,而不能读取数据行。MySQL可以使用索引返回选择列表中的字段,而无需根据索引再次读取数据文件。
使用索引条件:5.6版之后增加的新特性。当索引存在时,优化器将根据范围中的项目数和总数的比率来选择是使用索引还是遍历整个表。
使用位置:指示使用过滤的位置
使用连接缓冲区:指示使用连接缓存
不可能的where: where语句的where值始终为false,这是不可用的,不能用于获取任何元素
Distinct:优化distinct操作,找到第一个匹配的元组后停止寻找相同的值。
走漏
百分比值与行列值一起使用,可以估计查询执行计划(QEP)中上一个表的结果集,从而确定连接操作的周期数。小表驱动大表,减少连接数。
通过参数引入的解释,我们可以知道:
1表读取顺序(id)
2数据读取操作的操作类型(类型)
3实际使用了哪些索引(键)
4表间引用(引用)
5优化器查询每个表的多少行(行)
性能下降的原因
从程序员的角度来看
1查询语句写得不好
2未建立索引、索引不合理或索引无效

推荐阅读