本教程关注的重点是 MySQL、MariaDB 和 PerconaDB 数据库。这些信息也可能与其他数据库供应商有关,但在某些情况下可能不会。
我应该为我的 SQL 查询创建哪些索引?
根据通常的经验规则,当尝试优化你的 SQL 查询时,你可以依照以下步骤构建复合索引:
- 首先列出你的查询中所有使用的表,并为查询中的每个子查询创建一个独立的列表。如果你有一个包含 2 个 SELECT 子查询的 SELECT 查询,那你应该建立 3 个列表,每个列表包含引用在其中的表。
- 在此过程结束时,你可能会在每个查询列表中为每个这些表添加一个列的列表。
- 在你的任何索引中最左边的列应与查询相等比较(如 age = 25)中的列匹配。
- 你可以添加多个列,只要所有列与常量进行比较相等即可。
- 那么,你应该选择一个列,这将是“范围列(range column)”。MySQL 在每个索引中只支持一个范围列。
- 因此,你应该使用范围运算符(<>, >, <, IN(), BETWEEN, LIKE)来查看所有的比较,并选择可以过滤最多行数的那个。
- 将该列给该表添加为你的索引中的下一列。
- 你可以在这里获得一些信息 —— 关于在范围列之前添加相等列的理由(幻灯片由一位 MySQL 优化团队的成员编写)。
- 如果查询中不存在范围列,你可以添加 GROUP BY 子句中的列。
- 如果查询中不存在范围列,并且没有 GROUP BY 子句,则可以添加 ORDER BY 子句中的列。
- 在某些情况下,创建一个独立的索引来保存 ORDER BY 子句的列是有意义的,因为 MySQL 有时会选择使用它。请注意