Day 43 索引
索引
什么是索引:
可以理解为搜索引导,索引是一个特殊的数据结构,期存储的是数据的关键信息与详细信息的位置对应关系
为什么需要索引:
加速查询,当数据量非常大的时候,查询一个数据是非常慢的
索引的影响
- 并不是有的索引就能加速,要看查询语句是否正确的使用了索引
- 索引页需要占用额外的数据空间
- 添加索引后将导致表的增删改写入变慢(因为需要更新索引)
什么样的数据应该添加索引:
-
查询操作较多写入较少并且数据链很大时
-
查询与写入操作的占比大于10:1
-
本质上索引原理是因可能的减小搜索范围
磁盘IO
平均查找一个数据需要花费9ms,cpu会被切换到其他的程序去执行.我们要加速查询必须要减少IO操作的次数
索引数据结构
b+树:
在b+树种,叶子节点才是存储正是数据的,叶子数量越多,树的层级越高,导致IO次数增加,要避免这个问题,就应该将数据量小的数据作为索引
最左匹配原则
索引在查找时,是按照从左往右依次比较,如果查询语句没有出现在最左边的索引,将无法加速查询
聚集索引
聚集索引中包含了所有字段的值,如果已指定了主键,主键就是狙击索引,如果没有则找一个非空且唯一的字段作为聚集索引,如果也找不到,则自动生成一个字段作为聚集索引
直接查询聚集索引,当索引中包含了所有需要的字段时,称之为覆盖查询
聚集索引中存储了所有的数据
辅助索引
除了聚集索引意外的都叫辅助索引
辅助索引中值包含当前的索引字段和主键的值
覆盖查询
值得是在当前索引结构中就能找到所需的数据,如果使用的是狙击索引来查询name一定是覆盖查询,速度最快
回表查询
指得是在当前索引结构中找不到所需的数据,需要通过id去聚集索引中查询,速度慢于聚集索引
结论:
-
使用占用空间最小的字段来作为索引
-
不要在一行中存储太多的数据
-
尽量使用覆盖查询
-
如果字段区分度低(重复度高),建立素银是没有意义的,翻过来说应该
-
在模糊匹配中,备份好尽量不要写在前面
-
如果要查询的数据链给非常大,索引页没办法加速
-
不要在等号的左边做运算内容
-
and语句中会优先执行有索引的字段,所以我们应该在and语句用包含一个具备索引的字段(与位置无关)
-
避免使用or语句,or语句不会优先执行有索引的字段如果要用的话必须保证所有字段都有索引才能加速
-
联合索引中,顺序应该将区分度最高的放到左边,最低的放到右边,查询语句中必须保证最左边的索引在查询语句中
总结:不是添加了索引就能提速,需要考虑索引添加的是否合理,sql语句是否使用到了索引
创建索引的语法
create index 索引名字 on 表名称(字段名)
联合索引
create index 索引的名字 on 表名称(字段名,字段名)
删除索引
drop index 索引名称 on 表名称