mysql - 索引优化

78 阅读1分钟

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。

1.索引必须是独立的列

索引不能是表达式的一部分:如,where id +1 = 2,索引是不生效的
索引不能是函数的参数:如,where to_days(current_date),索引是不生效的

2.索引选择性

不重复的索引值数/总行数
索引的选择性越高越好
检查索引选择性代码:
select count(distinct city)/count(*) as sel from country;

3.字符列很长时可以使用前缀索引

使用前缀索引前一定要检查前缀的选择性
检查索引前缀选择性:
select count(distinct left(city, 3))/count(*) as sel3,
count(distinct left(city, 5))/count(*) as sel5,
count(distinct left(city, 7))/count(*) as sel7
from country;
缺点:
不能使用前缀索引做group byorder by,也无法做覆盖扫描
使用:
如果要查找域名,可以将字符串反序存储,然后做前缀索引

4.多列索引(复合索引)的列顺序

将选择性最高的列放到索引的最前列
最左原则

5.聚簇索引

数据行与相邻的键值紧凑的存储在一起
节点页包含索引,叶子页包含行数据
InnoDB是基于主键的聚簇索引
优点:
数据访问速度快
缺点:
增删改代价高
页分裂
二级索引(非聚簇索引)需要查询两次
二级索引以主键作为行指针

在这里插入图片描述