关于sql:何时使用索引?

When to use an index?

本问题已经有最佳答案,请猛点这里访问。

我有个问题:

1
2
3
4
5
SELECT MAX(Sales.Revenue-Sales.Costs), Company.Name
FROM Sales
INNER JOIN Company
ON Company.ID = Sales.ID
WHERE Sales.Date <= DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH);

我的问题是:我应该在哪里使用索引?为什么?


对于此查询:

1
2
3
4
5
6
SELECT MAX(s.Revenue - s.Costs),  c.Name
FROM Sales s INNER JOIN
     Company c
     ON c.ID = s.ID
WHERE s.Date <= DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH)
GROUP BY c.Name;

最优指标为综合指数(即有多个列):sales(date, id, revenue, costs)company(id, name)。这些索引覆盖了查询。这意味着所有数据都在索引中,所以不需要访问原始数据页。由于查询是结构化的,MySQL仍然需要使用文件排序进行聚合。

笔记:

  • 我添加了group by,所以查询是有意义的。
  • 表别名使查询更易于写入和读取。

如果您的sales和company表具有大量数据,则可能需要创建以下索引:

1
2
3
Sales -> Sales.ID
Sales -> Sales.Date
Company -> Company.ID

在join和where子句中使用这些列时,需要这些索引。如果表中有大量记录,则缺少索引将减慢查询速度。