索引
603字约2分钟
2024-09-26
提问
- 索引有哪些类型? 一般如何使用?
- 索引用的哪些数据结构?
- B+树是一种什么样的树, 为什么可以提高查询速度?
- B+树的叶子节点的指针对索引的优势体现在哪里?
- 命中了主键索引之后查询的时间复杂度是多少?
- 联合索引的最左匹配, 是针对什么场景?
- 现在有(A, B, C)的联合索引, 查询(B, C)的时候是否会命中联合索引?
索引的类型
- 普通索引
- 主键索引: 不允许null值
- 唯一索引: 允许null值
- 联合索引: 多个字段
- 全文索引: 用于优化匹配字符串中的关键词
LIKE '%xxx'
一般如何建立索引?
适合建立索引的字段
频繁查询的字段
WHERE
和ON
出现的字段因为SQL的优先级顺序为:
FROM
>JOIN
>WHERE
>GROUP BY
>HAVING
>SELECT
>DISTINCT
>ORDER BY
>LIMIT
有序的字段
区分度高的字段: 简单来说就是值的种类较多的
不适合创建的字段
- 区分度低: 比如'性别'这种字段
- 频繁更新的
- 过长的字段
- 无序的
索引的数据结构
MySQL使用的数据结构是 B+树.
与B树的区别
B+树的中间节点不存放数据, 而B树的中间节点存放数据.
优势
IO少
由于中间节点不存放数据, 所以同样大小的节点可以存储更多的索引. 这会导致B+树比B树更加的"矮", 减少了磁盘的IO.
范围查询
B+树的叶子节点之间存在横向的指针. 如果查询的是一个范围内的数据, 无需从根节点重新查找, 可以从叶子节点直接横向访问.
最左匹配原则
当同时有多个字段的索引时, 最左边的索引将会生效.
联合索引生效
联合索引(A, B, C)
意味着创建了A
, (A, B)
和(A, B, C)
三个索引.
如果联合索引(A, B, C)
, 查询(B,C)
时联合索引将不会生效, 查询(A, C)
时只有A
的索引生效.
命中索引后的查询复杂度
O(logN)