本文均已学习为主,不考虑实际业务。若在实际业务中,还需考虑增删改的代价和实际需要。
什么时候建索引
数据量大,查询业务多的
where从句
group by从句
order by从句
on从句
中的字段,可以考虑建索引。
联合索引怎么建
alter table t add index abc(a,b,c);
这里有一个原则:离散度大的列放在前
离散度:唯一值多,离散度越大
(eg:id>姓名>年龄>性别)
注意避免重复索引,冗余索引
(eg:(a,b,c)索引包含了(a)索引(最左前缀),故索引(a)就是冗余索引)
基于联合索引的知识点
覆盖索引:sql只需要通过索引就可以返回查询所需要的数据,避免了回表。
eg:select age from user where name='小松'
在这条语句中,如果加入索引(name,age),就可以使用覆盖索引,一次搜索索引树得出结果。
最左前缀原则:就是左边优先呗
- 在联合索引中体现在,索引(a,b,c)包含了索引(a,b)和索引(a)。建了索引(a,b,c),以a为条件查询可以走索引
- 在以一个字符串为索引的列,如果模糊查询,%放在了后边,还是可以走索引也是因为最左前缀原则
索引下推:MySQL5.6之后加入的,可以减少回表次数。
eg:select * from user where age=18 and sex='男'
id | name | age | sex |
---|---|---|---|
0 | 小 | 18 | 男 |
1 | 松 | 18 | 男 |
2 | 谷 | 18 | 女 |
3 | 弟 | 19 | 女 |
在有(age,sex)的联合索引前提下
如果没有索引下推,需要回表3次:根据age=18查出三个id,回到主键索引查出整条数据,在筛选满足sex='男’的两个数据。
如果有索引下推,需回表2次:同时根据age=18和sex='男’查出两个id,后边同上。