萤火小屋

优律的知识库

  • 首页
  • 归档
  • 分类
  • 标签
  • 留言
  • 关于

  • 搜索
消息队列 RabbitMQ Redis 双指针 力扣 动态代理 Git YAML SpringBoot SpringMVC 回溯算法 分治算法 归并排序 快排 手撕 事务 MySQL索引 MySQL 小技巧 Spring Framework Spring 动态规划 Linux Android 贪心算法 操作系统 进程调度模拟 IPv6 数据库 计算机组成原理 计算机基础 栈 Java 静态路由 路由器 交换机 数字通信 网络工程 计算机网络 Web http 大学学习技巧 程序设计 算法

MySQL数据库的索引

发表于 2021-03-15 | 分类于 MySQL | 0 | 阅读次数 255

索引分类

  1. 通常索引分类:普通索引、唯一索引、全文索引、空间索引(老版本InnoDB引擎可能不支持后两者)

  2. 按存储方式分类:B-Tree、Hash(InnoDB不支持Hash)

    B-Tree存储的所有数据是有序的!每个叶子和根距离相同。InnoDB使用的是B+树,NDB使用的是T树。

  3. 按依赖列数分类:单列索引、组合索引

  4. 按数据分布分类:聚簇索引、二级索引(辅助索引)

    聚簇索引末级即叶子直接存储了数据行,通常的主键索引就是聚簇索引。

  5. 按回表情况分类:覆盖索引

    当一个索引包含(覆盖)了需要查询的字段的值时,就称其为覆盖索引。

  • 聚簇索引包含了所有的数据,所以它也是一个覆盖索引,这个说法是错的。只有select、where中出现的列被索引覆盖的情况才是覆盖索引,此时Extra会显示Using index

最左前缀

-- 一个表T,索引有abc三个
table T, index(a, b, c)

-- 以下代码中x代表某数据

-- 全值匹配
select * from T where a='xx' and b='xx' and c='xx';  -- 可以走索引
select * from T where c='xx' and b='xx' and a='xx';  -- 可以走索引,引擎会优化

-- 匹配左前缀
select * from T where a='x';  -- 可以走索引
select * from T where b='x';  -- 不可以走索引,不可一跳列

-- 匹配列前缀
select * from T where a like 'x%';  -- 可以走索引
select * from T where a like '%x';  -- 不可以,要从开头匹配
select * from T where b like 'x%';  -- 不可以,不可以跳列

-- 匹配范围值
select * from T where a between 'x' and 'x';  -- 可以走索引
select * from T where b between 'x' and 'x';  -- 不可以,不可以跳列

-- 全值匹配 + 范围匹配
select * from T where a='x' and b between 'x' and 'x';  -- 可以走索引
select * from T where b='x' and c between 'x' and 'x';  -- 不可以
select * from T where a between 'x' and 'x' and b='x';  -- 不可以
  • 例如有一个表有L、F、B三个列,都是该表的索引,按照从左到右列的索引排序则为下表所示。

image.png

如图为按索引排序的数据,先精确匹配在范围匹配。
例如:当我们查找记录(行)L1、F3、B3时,按照索引搜索就如下图所示。

image.png

# 数据库 # MySQL # MySQL索引
MySQL所有的关联查询
MySQL-InnoDB引擎的事务
  • 文章目录
  • 站点概览
优律

优律

优律的知识库

83 日志
20 分类
44 标签
E-mail Twitter Instagram
Links
  • CZLisyx - 浮生志
  • Vedfolnir
0%
© 2019 — 2023 萤火小屋——优律的博客网站
网站已勉强运行 
Halo博客系统技术支持