基础
MySQL
MySQL
  • 基础知识
    • MySQL 的安装与配置
      • Windows
        • 安装
        • 配置文件
      • Linux
        • 安装
        • 配置文件
      • docker
      • mysql 配置文件格式
    • MySQL 查询的执行过程
      • MySQL 的客户端/服务器通信协议
      • MySQL 查询优化器
        • 优化器可能选择错误的执行计划
        • MySQL 能够处理的优化类型
          • 优化 COUNT()、MIN() 和 MAX()
          • 预估并转化为常数表达式
          • 提前终止查询
          • 排序优化
      • MySQL如何执行联接查询
    • 事务
      • ACID
      • 隔离级别
      • 死锁
      • 事务日志
      • 两阶段锁定协议
      • 多版本并发控制(MVCC)
  • SQL 优化
    • schema 设计
      • 选择数据类型
        • 整数类型
        • 实数类型
        • 字符串类型
          • VARCHAR 和 CHAR
          • BINARY 和 VARBINARY
          • BLOB 和 TEXT
          • ENUM 和 SET
        • 日期类型
      • 选择标识符
    • 索引
      • HASH 索引
      • B-tree 索引
      • 聚簇索引
      • 覆盖索引
      • 前缀索引和索引的选择性
      • 索引合并
      • 选择合适的索引列顺序
      • 使用索引扫描来做排序
      • 维护索引和表
    • 查询优化
      • 优化 SQL 语句的一般步骤
        • 1. 通过 show status 命令了解各种 SQL 的执行频率
        • 2. 定位执行效率较低的 SQL 语句
        • 3. 通过 EXPLAIN 分析低效 SQL 的执行计划
        • 4. 通过 SHOW PROFILE 分析 SQL
        • 5. 通过 TRACE 分析优化器如何选择执行计划
        • 6. 确定问题并采取相应的优化措施
      • 两个简单实用的优化方法
      • 一个复杂查询还是多个简单查询
      • 常用 SQL 的优化
        • 大批量插入数据
        • 优化 GROUP BY 语句
        • 优化联接查询
        • 优化分页查询
        • 优化 SQL_CALC_FOUND_ROWS
        • 优化 UNION 查询
    • Performance Schema
      • 配置
      • 使用
        • 检查SQL语句
        • 检查预处理语句
        • 语句剖析
        • 检查读写性能
        • 检查内存使用情况
        • 检查变量
    • MySQL线程
    • 复制
      • 概述
        • 复制中的各类文件
        • 三种复制格式
        • 全局事务标识符(GTID)
        • 崩溃后的复制安全
      • 安装
        • 基于二进制日志文件位置的复制
        • 基于GTID的复制
      • 复制拓扑
        • 主动/被动模式
        • 主动/只读池模式
        • 多级复制架构
  • 其他
    • 查询缓存
    • 批量insert
    • MySQL 锁的类型
    • MySQL 的索引有哪些
    • INSERT ... ON DUPLICATE KEY UPDATE Statement
由 GitBook 提供支持
在本页
  • 索引使用三原则
  • 如何判断索引是否合理
  1. SQL 优化

索引

索引,在 MySQL 中也叫作键(key),是存储引擎用于快速找到记录的一种数据结构。索引是数据库优化中最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的 SQL 性能问题。

索引是在 MySQL 的存储引擎层中实现的,而不是在服务器层实现的。所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型。

MySQL 目前提供了以下 4 种索引:

  • B-Tree 索引:最常见的索引类型,大部分引擎都支持 B 树索引。

  • HASH 索引:只有 Memory 引擎支持,使用场景简单。

  • R-Tree 索引(空间索引):空间索引是 MyISAM 的一个特殊索引类型,主要用于地理空间数据类型。

  • Full-text(全文索引):全文索引也是 MyISAM 的一个特殊索引类型,主要用于全文索引,InnoDB 从MySQL 5.6 版本开始提供对全文索引的支持。

MySQL 目前不支持函数索引,但是能对列的前面某一部分进行索引,例如标题 title 字段,可以只取 title 的前 10 个字符进行索引,这个特性可以大大缩小索引文件的大小,但前缀索引也有缺点,在排序 Order By 和分组 Group By 操作的时候无法使用。

索引
MyISAM
InnoDB
Memory

B-Tree索引

支持

支持

支持

HASH索引

不支持

不支持

支持

R-Tree索引

支持

不支持

不支持

Full-text索引

支持

支持

不支持

表中的索引越多,插入的速度越慢。一般来说,增加新索引会导致 INSERT、UPDATE、DELETE 等操作的速度变慢,特别是当新增索引后达到了内存瓶颈的时候。

索引使用三原则

在 MySQL 中,大多数情况下都会使用 B-tree 索引,其他类型的索引大多只适用于特殊的目的。如果在合适的场景中使用索引,将大大缩短查询的响应时间。

在选择索引和编写利用这些索引的查询时,有如下三个原则始终需要记住:

  • 单行访问是很慢的,特别是在机械硬盘中(SSD 的随机 I/O 要快很多,不过这一点仍然成立)。如果服务器从存储中读取一个数据块只是为了获取其中一行,那么就浪费了很多工作。最好读取的块中能包含尽可能多的所需要的行。

  • 按顺序访问范围数据是很快的,有两个原因:

    • 第一,顺序 I/O 不需要多次磁盘寻道,所以比随机 I/O 要快很多(特别是对于机械硬盘)

    • 第二,如果服务器能够按需顺序读取数据,那么就不再需要额外的排序操作,并且 GROUP BY 查询也无须再做排序和将行按组进行聚合计算了

  • 索引覆盖查询是很快的。如果一个索引包含了查询需要的所有列,那么存储引擎就不需要再回表查找行,这避免了大量的单行访问。

总的来说,编写查询语句时应该尽可能选择合适的索引以避免单行查找,尽可能地使用数据内部顺序从而避免额外的排序操作,并尽可能地使用索引覆盖查询。

如何判断索引是否合理

  1. 首先,按响应时间来对查询进行分析。找出那些消耗时间最长的查询或者那些给服务器带来最大压力的查询。

  2. 然后,检查这些查询的 schema、SQL 语句和索引结构,判断是否有查询扫描了太多的行,是否做了很多额外的排序或者使用了临时表,是否使用随机 I/O 访问数据,或者是否有太多回表查询查询那些不在索引中的列的操作。

  3. 如果一个查询无法从所有可能的索引中获益,则应该看看是否可以创建一个更合适的索引来提升性能。如果不行,还可以看看是否可以重写该查询,将其转化成一个能够高效利用现有索引或者新创建索引的查询。

上一页选择标识符下一页HASH 索引

最后更新于8个月前