查询语句的执行计划 explain
从低到高的顺序:
ALL(全表扫描)、【避免】 index(全索引扫描)【避免】 range范围扫描 ref非唯一索引扫描、 eq_ref唯一索引扫描 const结果只有一条的主键或唯一索引扫描 [索引失效] 1索引列上做了计算 函数 类型转换等操作 2like匹配使用了前缀匹配符"%ab" 3字符串不加引号导致类型转换 查询过程需要扫描整个索引并回表,代价高于直接全表扫描 可能出现全表扫描(索引列上用了!= >= <= or in,索引列上用了 is null is not null) 强制走索引:
select * from student force index(‘index_name’)where name>='Rose'如何建立高效索引 建立前缀索引 create index on student index_name_pre(name(5)) 建立覆盖索引 (覆盖索引是sql 中query的所有字段,在索引B+tree的叶子节点上都能找到那些索引)
联合索引 最左匹配准则 区分度大的字段排在前面(distinct(column/count(*)))
join order by group by join 参与join的字段上一般需要加上索引
提倡尽量结合现有的索引字段进行order by操作 尽量避免低效的文件排序操作 group by如果能够依赖索引完成,则不需要额外的临时表
索引的缺德 1 索引会带来数据写入延迟 2 索引会引入额外的空间损耗 3索引能提升查询效率的场景有限 大数据下 要进行读写分离 分库分表等方案