MySQL之索引 索引

1. 什么是索引

​ 可以理解为:搜索引导,索引是一个特殊的数据结构。其存储的是数据的关键信息与详细信息的位置对应关系。索引的本质就是不断的减少搜索的范围。

​ 例如:书本的目录

2. 为什么需要索引

​ 加速查询,当数据量非常大的时候,查询某一个数据是非常慢的。

3. 索引的影响:

  1. 不是说有了索引就能加速,得看你的查询语句有没有正确使用索引
  2. 索引也需要占用额外的数据空间,索引本身很大,可以存放在内存、硬盘(通常为硬盘)
  3. 添加索引后,对增加、删除、修改 会 变慢(写入)
  4. 索引不是所有情况均适用。a. 少量数据 b. 频繁更新的字段 c. 很少使用的字段
  5. 索引会降低增删改的效率()

4. 什么样的数据应该添加索引:

  1. 查询操作较多写入较少并且数据量很大时

索引的分类:

  1. 单值索引:单指单列 一个表中可存在多个,比如:alter table user add index 索引名称(索引的字段);
  2. 唯一索引:
  3. 复合索引:多个列构成的。(相当于二级目录,比如找名字姓找的人,先找z,然后在z中找zhao)

5. 索引树的高度和叶子的关系

​ 叶子节点才是存储数据的,它存储的数据的空间是定长的。叶子的数量越多,树就越高。因此叶子节点尽可能存储更多的数据。换一句话说 应该将数据量小的字段作为索引

6. 联合索引(最左匹配原则)

​ 遵循原则,从左往右进行比较。成为最左匹配原则

7. 聚集索引

聚集索引中包含了所有字段的值,如果拟制定了主键,主键就是聚集索引,如果没有则找一个非空且唯一的字段作为聚集索引,如果也找不着,自动生成一个字段作为聚集索引 
聚集索引中的叶子节点存储了所有字段值

8. 辅助索引

除了聚集索引之外的都叫辅助索引(第二索引),辅助索引中只包含当前的索引字段和主键值
	回表操作的触发条件

9. 覆盖查询

能通过索引一次性直接找到数据的,这个过程就称为覆盖查询

10. 回表查询

通过辅助索引一次性查询不到对应的数据,需要再通过聚集索引 再查询。这个成为回表查询

11. 结论:

  1. 使用占用空间最小的字段来作为索引

  2. 在B+数中查询任意的数据次数:N次(B+树的高度)

  3. 不要在一行中存储太多的数据,例如小说/视频/,如果字段太多可以分表

  4. 尽量使用覆盖查询

  5. 速度:聚集索引 > 辅组索引 > 非索引

  6. 如果字段对应的值的区分低,建立索引是没有意义的。反过来说应该将区分度高的字段作为索引

  7. 模糊匹配中,百分号尽量不要写在前面

  8. 不要再等号的左边做运算

    例如:select count(*) from usr where id * 3 = 6; 也会遍历所有记录

  9. and语句中会自动找一个具备索引的字段优先执行,所以我们应该在and语句中至少包含一个具备索引的字段

  10. or语句要避免使用,如果要用则保证所有字段都有索引才能加速

  11. 联合索引中,顺序应该将区分度最高的放到左边,最低的放右边

    查询语句中必须保证最左边的索引出现在语句中

注意:

  1. 如果要查询的数据量非常大 索引无法加速
  2. 不是添加了索引就能提速,需要考虑索引添加的是否合理,sql语句是否使用到了索引

创建索引的语法

create index 索引的名字 on 表名称(字段名称);

alter table 表名 add index 索引名字 字段名称;