MySQL索引建立和优化笔记

查询语句的执行计划
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索引能提升查询效率的场景有限
大数据下 要进行读写分离 分库分表等方案

猜你喜欢

转载自blog.csdn.net/weixin_45010894/article/details/109194024