定义
- 帮助MySQL高效获取数据的数据结构
- 默认都是使用B+树结构组织的索引
分类
- 数据结构纬度
- B+树索引:所有数据存储在叶子节点,复杂度为O(logn),适合范围查询。
- 哈希索引:适合等值查询,检索效率高,一次到位。
- 全文索引:MyISAM和InnoDB中都支持使用全文索引,一般在文本类型char,text,varchar类型上创建。
- 物理存储纬度
- 聚簇索引:聚簇索引就是以主键创建的索引,在叶子节点存储的是表中的数据。(Innodb存储引擎)
- 非聚簇索引:非聚簇索引就是以非主键创建的索引,在叶子节点存储的是主键和索引列。(Innodb存储引擎)
- 逻辑纬度
- 主键索引:一种特殊的唯一索引,不允许有空值。
- 普通索引:基本索引类型,允许空值和重复值。
- 联合索引:多个字段创建的索引,使用时遵循最左前缀原则。
- 唯一索引:索引列中的值必须是唯一的,但是允许为空值。
- 空间索引:MySQL5.7之后支持空间索引,在空间索引这方面遵循OpenGIS几何数据模型规则。
MsSQL 读取数据格式
数据库的 I/O 操作的最小单位是 **数据页**,InnoDB 默认的大小是 16KB
数据页包括 文件头、用户记录、页目录等
- 文件头:有两个指针,分别指向上一个数据页和下一个数据页,连接起来相当于一个双向的链表
- 用户记录:按照主键顺序组成单向链表
- 页目录:由多个槽按照先后顺序组成
- 将用户记录划分成几个组,记录包括最小记录(第一条记录)和最大记录(最后一条记录)
- 组中最后一条记录会存储该组一共有多少条记录
- 组中最后一条记录的地址偏移量称为槽,相当于分组记录的索引
数据结构
Hash表
- 优点:
- 适合单值快速检索数据
- 缺点:
- 不支持顺序和范围查询
二叉树
- 优点:
- 平衡时查询的时间复杂度为 O(log2(N))
- 缺点:
- 不平衡时查询的时间复杂度最大为O(N)
平衡二叉树
- 优点:
- 查询的时间复杂度都是 O(log2(N))
- 缺点:
- 数据量大时磁盘IO次数多
- 不支持范围查询
B树
- 特点:
- B树的节点中存储这多个元素,每个内节点有多个分叉
- 节点中的元素包含键值和数据,节点中的键值从大到小排列。
- 父节点当中的元素不会出现在子节点中。
- 所有的叶子节点都位于同一层,叶子节点具有相同的深度,叶子节点之间没有指针连接。
- 优点:
- 可以很好的提升查询的效率
- 缺点:
- 不支持范围快速查询
- 行记录增加,所占空间变大,树高度变高,磁盘IO次数变大
B+树
- 特点:
- 只有叶子节点才会存储数据,非叶子节点只存储键值key
- 叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表
- 优点:
- 可以保证等值和范围查询的快速查找
- 缺点:
- 会占用更多的空间
回表与索引覆盖
- 如果某个查询语句使用了二级索引,但是查询的数据不是主键值,这时在二级索引找到主键值后,需要去聚簇索引中获得数据行,这个过程就叫作「回表」,也就是说要查两个 B+ 树才能查到数据。
- 当查询的数据是主键值时,因为只在二级索引就能查询到,不用再去聚簇索引查,这个过程就叫作「索引覆盖」,也就是只需要查一个 B+ 树就能找到数据。
索引优化
使用EXPLAIN关键字可以模拟优化器执行SQL查询语句
- 避免索引失效
- 最左前缀匹配原则
- 不在索引列上做任何计算、函数操作
- 不使用:不等于和is not null
- like不以通配符开头
- 字符串字段不加单(双)引号
- 不使用 or 连接
- 关联查询优化
- 内连接时,mysql 会自动把小结果集选为驱动表,所以大表字段需加上索引
- 左外连接时,左表(驱动表)会全表扫描,所以右边大表字段需加上索引
- 右外连接同理,被驱动表上的字段需建立索引
- 排序、分组优化
- 尽量避免使用Using FileSort方式排序
- 语句满足索引最左匹配
- 不要出现索引范围查询
- 慢查询日志
参考文章:MySQL的B+树