索引失效
1. 优化器不走索引
1.1 原因分析
sql
select * from t_user where name = 'David';如果name加有唯一索引,等值查询1次就走索引查询1次,执行sql10次就是走索引查询10次,如果是50w行数据都去查询,就涉及查询索引50w次,如果B+树的层级是3,那么就是走50w3=150w次IO。 如果走全表扫描,50w数据如果每行100字节,那么要走的IO是50100/16KB≈0.3w次IO, 因此居于查询成本的考虑,优化器没有走索引。
1.2 使用MRR
MRR(Multi-Range Read)是一种索引查询优化技术,用于提升范围查询(如 WHERE id BETWEEN 100 AND 200)的性能。它的底层使用了临时内存缓冲区,将索引扫描的结果缓存到临时缓冲区并按主键排序,然后按主键顺序批量读取数据,将随机I/O转换为顺序I/O,显著提升磁盘效率。
sql
-- 使用hint语法
select /* MRR(t_user) */ * from t_user where name = 'David';