索引
1. 什么是索引
可以理解为:搜索引导,索引是一个特殊的数据结构。其存储的是数据的关键信息与详细信息的位置对应关系。索引的本质就是不断的减少搜索的范围。
例如:书本的目录
2. 为什么需要索引
加速查询,当数据量非常大的时候,查询某一个数据是非常慢的。
3. 索引的影响:
- 不是说有了索引就能加速,得看你的查询语句有没有正确使用索引
- 索引也需要占用额外的数据空间,索引本身很大,可以存放在内存、硬盘(通常为硬盘)
- 添加索引后,对增加、删除、修改 会 变慢(写入)
- 索引不是所有情况均适用。a. 少量数据 b. 频繁更新的字段 c. 很少使用的字段
- 索引会降低增删改的效率()
4. 什么样的数据应该添加索引:
- 查询操作较多写入较少并且数据量很大时
索引的分类:
- 单值索引:单指单列 一个表中可存在多个,比如:alter table user add index 索引名称(索引的字段);
- 唯一索引:
- 复合索引:多个列构成的。(相当于二级目录,比如找名字姓找的人,先找z,然后在z中找zhao)
5. 索引树的高度和叶子的关系
叶子节点才是存储数据的,它存储的数据的空间是定长的。叶子的数量越多,树就越高。因此叶子节点尽可能存储更多的数据。换一句话说
应该将数据量小的字段作为索引
6. 联合索引(最左匹配原则)
遵循原则,从左往右进行比较。成为最左匹配原则
7. 聚集索引
聚集索引中包含了所有字段的值,如果拟制定了主键,主键就是聚集索引,如果没有则找一个非空且唯一的字段作为聚集索引,如果也找不着,自动生成一个字段作为聚集索引 聚集索引中的叶子节点存储了所有字段值
8. 辅助索引
除了聚集索引之外的都叫辅助索引(第二索引),辅助索引中只包含当前的索引字段和主键值 回表操作的触发条件
9. 覆盖查询
能通过索引一次性直接找到数据的,这个过程就称为覆盖查询
10. 回表查询
通过辅助索引一次性查询不到对应的数据,需要再通过聚集索引 再查询。这个成为回表查询
11. 结论:
使用占用空间最小的字段来作为索引
在B+数中查询任意的数据次数:N次(B+树的高度)
不要在一行中存储太多的数据,例如小说/视频/,如果字段太多可以分表
尽量使用覆盖查询
速度:聚集索引 > 辅组索引 > 非索引
如果字段对应的值的区分低,建立索引是没有意义的。反过来说应该将区分度高的字段作为索引
模糊匹配中,百分号尽量不要写在前面
不要再等号的左边做运算
例如:select count(*) from usr where id * 3 = 6; 也会遍历所有记录
and语句中会自动找一个具备索引的字段优先执行,所以我们应该在and语句中至少包含一个具备索引的字段
or语句要避免使用,如果要用则保证所有字段都有索引才能加速
联合索引中,顺序应该将区分度最高的放到左边,最低的放右边
查询语句中必须保证最左边的索引出现在语句中
注意:
- 如果要查询的数据量非常大 索引无法加速
- 不是添加了索引就能提速,需要考虑索引添加的是否合理,sql语句是否使用到了索引
创建索引的语法
create index 索引的名字 on 表名称(字段名称);
alter table 表名 add index 索引名字 字段名称;