mysql查看索引使用

哈,你的总结很完整,但是感觉就像在看手册一样……我给你一个如何使用它的指南,这可能会让你感觉好一些。

上周一位客户问我为什么查询这么慢。
我看表结构,索引都建好了,为什么这么慢?这件事需要一步步调查。

最直接的方法是先使用SHOWINDEX,如你所说的SHOWINDEXFROM命令;这个东西速度非常快,几秒钟就能出结果。
看看这个表有多少个索引,它们的类型以及是否唯一……比如我上次看的时候,有一个表有3 个全值索引。
这必须优化。
但光看这个,你并不知道这个索引到底有没有用。
例如,这个索引是根据订单量构建的,但大多数查询都是按时间过滤的,所以这个索引本质上是白建的。

所以你需要在第二步中使用EXPLAIN,例如EXPLAIN SELECT FROM order WHERE order_date = '2 02 3 -1 2 -01 ';查看结果中的类型字段。
如果是ALL,则表示表扫描已满,索引无法使用。
关键是看key是不是你期望的索引名。
例如,在我上面的日期查询中,如果键为NULL,则肯定不会命中索引。
如果“Usingindex”写在Addition中,则说明是封闭索引,查询效率非常高。
直接从索引中获取数据即可。
上次调优一个电商订单表,用EXPLAIN发现复合索引构建错误。
改了之后,查询速度提升了一倍。

但是EXPLAIN只能看到一个查询。
如果你真的想知道索引是如何使用的,你需要使用PerformanceSchema。
这个东西可以统计索引的读、写、删除的次数,很全面。
比如我昨天使用SELECT FROM Performance_schema.index_usage查看,发现备份表索引几乎没什么用,所以我严格删除它以节省空间。
InnoDB的SHOWINNODBSTATUS也非常有用,特别是查看BufferPool中的Indexreads和Indexhits。
我有一个系统,由于缓冲池太小,索引命中率只有3 0%。
然后加上8 G之后,继续跳升至9 0%以上。

当然,如果你确实想要长期监控,高级工具会派上用场。
例如,Percona Toolkit 中的 pt-index-usage 可以告诉您在运行慢速查询日志后哪些索引最没用,哪些索引最频繁。
上次使用这个工具时,我发现遗留系统中有一个索引,十年来只被查询了3 次。
我继续建议客户删除它。
像 Percona Index Monitor 这样的可视化工具更令人惊叹。
您可以实时看到查询命中索引。

我遇到的陷阱是当我急于上网而没有使用这些工具进行彻底检查时。
我只是用EXPLAIN随便添加索引。
结果,系统负载猛增。
然后我发现选择了错误的索引。
因此,首先使用SHOWINDEX和EXPLAIN解决基本问题,使用PerformanceSchema进行深入分析,并使用高级工具进行长期监控。

无论如何,这取决于你。
使用哪种工具取决于您的需求。
有时,对于简单的场景,简单的 EXPLAIN 就足够了,而复杂的系统则需要全套武器。
我还在考虑如何最合适地调整 Hitrate BufferPool...

MySQL中有多少种索引?索引的底层实现原理是?

索引类型:B+Tree最常用,Hash仅Memory引擎支持,R-Tree空间索引和全文索引子引擎。

B+Tree原理:多路径平衡树,数据存储在叶子节点,叶子节点链表随着时间段优化查询。

Hash的缺点:不支持范围查询,不排序。

GIS中使用R-Tree,中文全文索引需要扩展。

索引选择:B+Tree是通用的,不要滥用索引,通用索引使用左前缀。

说实话:索引的选择要看场景,B+Tree基本就够了。