使用多列索引MYSQL进行优化

使用多列索引MYSQL进行优化,mysql,indexing,query-optimization,amazon-aurora,Mysql,Indexing,Query Optimization,Amazon Aurora,正在寻找在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

正在寻找在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 

上下文记录总数:204830。我的日期范围内的记录:65491

在不同顺序的列上使用索引应该做得更好:

ALTER TABLE table_x ADD INDEX (serviceID, initialStatus, sales_date);
索引中列的顺序很重要。您在销售日的条件是范围条件,即它可能匹配多个值。而serviceID和initialStatus上的其他两个条件是与一个值匹配的相等条件(如果找不到该值,则为零)

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

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

这样的条件,其中A=1、B=2和C=3将使用索引的所有三列

这样的条件,其中A=1和B>2以及C=3将只使用索引中的列A和B。然后,列C的条件将逐行应用于与A和B条件匹配的所有行

这样的条件,其中A>1、B=2和C=3将仅使用A上的第一列进行索引查找

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


你可能会喜欢我的演示。

你能包括你用来创建多列索引的代码吗?可能的错误:
sales_date 65491在日期范围内,但结果集中有多少?@RickJames放弃了这个角色。谢谢你的提示,谢谢!这个指数起作用了。很棒的幻灯片,它们会对我有很大帮助。
ALTER TABLE table_x ADD INDEX (serviceID, initialStatus, sales_date);