【问题标题】:Optimize with Multi Column Index MYSQL使用多列索引 MYSQL 进行优化
【发布时间】:2017-06-05 04:27:25
【问题描述】:

寻找在 MySQL 中优化以下查询的方法。我尝试在 sales_date、serviceID 和 initalStatus 上创建多列索引,但它没有被使用。我尝试过研究,但对优化不熟悉,似乎找不到合适的答案。以下是查询:

SELECT 
COUNT(id) as TotalAccounts,
AVG(sale_value) AS SaleValue,
AVG(credit_card = 1) * 100 AS CreditCard,
SUM(CASE WHEN pre_status = 1 AND bill_status = 'current' THEN 1 
ELSE 0
END) AS Active, 
SUM(CASE WHEN pre_status = 1 AND bill_status = 'past' THEN 1 
ELSE 0
END) AS PastDue, 
SUM(CASE WHEN `status` = 0 AND bill_status = 'past' THEN 1 
ELSE 0
END) AS Canceled
FROM table_x  
WHERE sales_date >= CAST('2015-01-01' AS DATE) 
AND sales_date <= CAST('2016-01-01' AS DATE)
AND serviceID = 1
AND initialStatus = 1 

还有 EXPLAIN 输出:

id:            '1',
select_type:   'SIMPLE',
table:         'table_x',
type:          'ALL', 
possible_keys: 'sales_date,Combo sales_date office_id,salesDate_serviceID_initalStatus', 
key:           NULL,
key_len:       NULL,
ref:           NULL,
rows:          '177585',
Extra:         'Using where'

对于上下文,总记录:204,830。我的日期范围内的记录:65,491。

【问题讨论】:

  • 能否包含用于创建多列索引的代码?
  • 可能的错误:sales_date &lt;= CAST('2016-01-01' AS DATE) 包括结束日期。更改为简单的 sales_date &lt; '2016-01-01' 。另请注意,不需要强制转换。
  • 65,491 在日期范围内,但结果集中有多少?
  • @RickJames 摆脱了选角。感谢您的提示。

标签: mysql indexing query-optimization amazon-aurora


【解决方案1】:

您应该更好地使用不同顺序的列上的索引:

ALTER TABLE table_x ADD INDEX (serviceID, initialStatus, sales_date);

索引中列的顺序很重要。您对 sales_date 的条件是 范围条件,即它可能匹配多个值。而 serviceID 和 initialStatus 上的其他两个条件是相等条件,它们匹配一个值(如果未找到该值,则为零)。

通常情况下,在索引查找中,所有相等条件都必须位于多列索引中最左侧的列上。一旦索引的一列用于范围条件,索引右侧的任何其他列都不会使用。

假设列(A、B、C)上有一个索引。

WHERE A=1 AND B=2 AND C=3 这样的条件将使用索引的所有三列。

WHERE A=1 AND B&gt;2 AND C=3 这样的条件将仅使用索引中的列 A 和 B。然后将 C 列的条件逐行应用于与 A 和 B 条件匹配的所有行。

WHERE A&gt;1 AND B=2 AND C=3 这样的条件只会使用 A 上的第一列进行索引查找。

WHERE 子句中的术语顺序不必与索引定义中的列顺序相同。 MySQL 知道如何重新排列术语以匹配列顺序。

你可能会喜欢我的演示文稿How to Design Indexes, Really

【讨论】:

  • 谢谢!该指数有效。很棒的幻灯片,它们对我有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2016-08-25
  • 2011-09-03
  • 2016-05-18
  • 1970-01-01
相关资源
最近更新 更多