目录
- 索引
- 1.什么是索引
- 2.为什么需要索引
- 3.索引的影响
- 4.磁盘IO
- 5.索引数据结构
- 6.聚集索引辅助索引
- 7.结论
- 8.创建索引的语法
索引
1.什么是索引
索引是一个特的数据结构,其存储的是数据的关键信息和详细信息的位置对应关系。
2.为什么需要索引
因为当数据量非常大的时候,查询某一个数据是非常慢,我们可以使用索引来加速查询
3.索引的影响
- 不是说有了索引就能加速,还需要看查询语句有没有正确的使用索引
- 索引也需要占用额外的数据空间
- 添加索引后将导致增减删除修改变慢
查询操作较多时,写入较少时我们使用索引,本质上索引原理就是通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,尽可能的减小搜索范围
4.磁盘IO
磁盘读取数据,一次磁盘IO的时间约等于5+4.17 = 9ms左右,磁盘IO是非常高昂的操作,计算机操作系统做了一些优化,当一次IO时,不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓冲区内,因为局部预读性原理告诉我们,当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。
5.索引数据结构
b+树
在b+树中 叶子节点才是存储真实数据的,叶子数量越多,树的层级越高,会导致IO次数增加 ,要避免这个问题,在叶子节点中尽可能的存储更多的数据, 应该将数据量小的字段作为索引
当b+树的数据项是复合的数据结构,b+数是按照从左到右的顺序来建立搜索树的,索引具有最左匹配特性。
6.聚集索引辅助索引
数据库中的B+树索引可以分为聚集索引(clustered index)和辅助索引(secondary index)
聚集索引中包含了所有字段的值,如果拟制定了主键,主键就是聚集索引,如果没有则找一个非空且唯一的字段作为聚集索引,如果也找不着,自动生成一个字段作为聚集索引
聚集索引中存储了所有的数据
表中除了聚集索引外其他索引都是辅助索引,辅助索引中只包含当前的索引字段和主键的值
覆盖查询:指得是在当前索引结构中就能找到所有需要的数据 ,如果使用聚集索引来查询那么就一定是覆盖查询,速度是最快的
回表查询:指得是在当前索引结构中找不到所需的数据,需要通过找到的主键索引值去聚集索引中查询 ,速度慢于聚集索引
7.结论
1.使用占用空间最小的字段来作为索引
2.不要再一行中存储太多的数据,例如小说,视频,如果字段太多可以分表
3.尽量使用覆盖查询
4.如果字段区分度低(重复度高),建立索引是没有意义,反过来说应该将区分度高的字段作为索引
5.模糊匹配中,百分号尽量不要写在前面
6.不要再等号的左边做运算
例如:select count() from usr where id 3 = 6; 也会遍历所有记录
7.and语句中会自动找一个具备缩印的字段优先执行,所以我们应该在and语句中至少包含一个具备索引的字段
8.or语句要避免使用,如果要用则保证所有字段都有索引才能加速
9.联合索引中,顺序应该将区分度最高的放到左边,最低的放右边,
查询语句中必须保证最左边的索引出现在语句中
另外需要注意:如果要查询的数据量非常大 索引无法加速
总结: 不是添加了索引就能提速,需要考虑索引添加的是否合理,sql语句是否使用到了索引
8.创建索引的语法
create index 索引的名字 on 表名称(字段名)
联合索引
create index 索引的名字 on 表名称(字段名,字段名)
create index union_index on usr(id,email,name,gender);
删除索引:
drop index 索引名称 on 表名称;