MySQL 索引笔记

B Tree

AVL Tree 的进化,一个 Node 上可以储存多个值,充分利用一个 Page 的内存大小(默认16 KB)。
在这里插入图片描述

B+ Tree

B Tree 的进化,增强了扫表能力和范围查询能力,IO性能更好(非叶子节点没有放数据,能够放更多的指针),效率更稳定。
在这里插入图片描述

五种索引

  • 普通索引:没有限制
  • 唯一索引:每行数据该列唯一,可以为 NULL,可以多个。
  • 主键索引:有且必有一个,不能为 NULL。
  • 联合索引:见下文。
  • 全文索引:用特殊的语法 MATCH、AGAINST 进行搜索。只能用于 CHAR、VARCHAR、TEXT。

聚簇索引

索引的物理顺序与索引键的顺序一致。其实就是主键

  1. 如果有主键,主键就是聚簇索引。
  2. 如果1不成立,找不包含 NULL 的第一个唯一索引为主键和聚簇索引。
  3. 如果1和2不成立,用自动生成的 row_id 作为主键和聚簇索引。

联合索引

键是一种联合的结构。因为这种结构,有最左匹配原则:
index(a, b, c)

  • a 一定要用到(带头大哥不能死)
  • 如果要用c,b一定要用到(中间兄弟不能断)

如果创建 index(a, b, c)
其实是创建了 index(a) index(a, b) index(a, b, c)
在这里插入图片描述

辅助索引

除了主键索引外的索引都是辅助索引。只有主键索引的值是数据,辅助索引的值是主键索引的键。
在这里插入图片描述
查了辅助索引,再去查主键索引的过程,叫回表

覆盖索引

不是一种索引,而是索引的使用情况。即,用到的索引包含了查找的字段。
如上图,如果是 select name from user where name = 'Q';,只需要 name,所以不需要再查主键索引,这种情况就是覆盖索引。

在 explain 里,Extra 列,如果有 Using Index 就代覆盖索引,不用回表。
而 key 列,代表用了什么索引,如,联合索引。

用不到索引

  1. 索引列参与运算,如使用函数、隐式转换等
  2. like 条件前面带%
  3. 负向查询:NOT LIKE、!=、NOT IN

索引的弊端

  1. 创建维护索引要耗费时间。数据量越大,花的时间越长。
  2. 除了数据表占数据空间之外,每一个索引还要占一定的物理空间
  3. 当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,降低了数据的维护速度

创建索引需要注意什么

  1. 在经常需要查找的列上建立索引,可以加快搜索的速度。

  2. 在经常需要根据范围进行查找的列上创建索引,因为索引已经排序,所以其指定的范围是连续的。

  3. 在经常使用 where子句的列上创建索引,加快条件的判断速度。

  4. 在经常使用表连接的列上创建索引,可以加快表连接的速度。

  5. 在经常需要排序的列上创建索引,因为索引已经排序,所以查询时可以利用索引的排序,加快排序查询。

  6. 主键最好是趋势递增的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值