【发布时间】: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 <= CAST('2016-01-01' AS DATE)包括结束日期。更改为简单的sales_date < '2016-01-01'。另请注意,不需要强制转换。 -
65,491 在日期范围内,但结果集中有多少?
-
@RickJames 摆脱了选角。感谢您的提示。
标签: mysql indexing query-optimization amazon-aurora