我正在尝试向MySQL数据库添加索引,因为系统使用的统计数据库中的查询速度太慢。
大约需要30分钟才能获得50,000个元组中的1分钟统计信息
首先,我尝试为每列添加一个索引,但这会导致数据库性能下降。因为查询使用多列,所以我应该使用实际使用的索引。
下面使用的是简单版本中的实际查询。 情况可能会改变,
SELECT TIME,A,B,C,D,E,F,G FROM STAT_TBL1 WHERE TIME >='2019-07-04 16:00:00' AND TIME <='2019-07-04 16:59:59' AND H IN ('blah1') AND I IN ('blah2') ORDER BY TIME
SELECT TIME,A,B,C,D,E,F,G FROM STAT_TBL2 WHERE TIME >='2019-07-04 16:00:00' AND TIME <='2019-07-04 16:59:59' AND J IN ('blah3') AND K IN ('blah4') ORDER BY TIME
SELECT TIME,A,B,C,D,E,F,G FROM STAT_TBL3 WHERE TIME >='2019-07-04 16:00:00' AND TIME <='2019-07-04 16:59:59' AND H IN ('blah1') AND I IN ('blah2') AND J IN ('blah3') AND K IN ('blah4') ORDER BY TIME
我尝试创建以下索引:
CREATE INDEX IDX_LIST1_01 ON STAT_TBL1 (TIME)
CREATE INDEX IDX_LIST1_02 ON STAT_TBL1 (H)
CREATE INDEX IDX_LIST1_03 ON STAT_TBL1 (I)
CREATE INDEX IDX_LIST2_01 ON STAT_TBL3 (TIME)
CREATE INDEX IDX_LIST2_02 ON STAT_TBL3 (J)
CREATE INDEX IDX_LIST2_03 ON STAT_TBL3 (K)
CREATE INDEX IDX_LIST3_01 ON STAT_TBL3 (TIME)
CREATE INDEX IDX_LIST3_02 ON STAT_TBL3 (H)
CREATE INDEX IDX_LIST3_03 ON STAT_TBL3 (I)
哪个更好?为每列添加索引还是为多列添加索引?
答案 0 :(得分:0)
具有多列的索引通常会更快。将日期用于多列索引以及通常用于过滤数据的一两个其他列。如果使用不同查询的不同列来过滤数据,则必须创建那么多索引。
答案 1 :(得分:0)
SELECT TIME,A,B,C,D,E,F,G
FROM STAT_TBL1
WHERE TIME >='2019-07-04 16:00:00'
AND TIME <='2019-07-04 16:59:59'
AND H IN ('blah1')
AND I IN ('blah2')
ORDER BY TIME
因此最好被索引:
INDEX(H, I, TIME) -- H and I in either order, then TIME
此外,我建议将其用于时间比较:
WHERE TIME >= '2019-07-04 16:00:00'
AND TIME < '2019-07-04 16:00:00' + INTERVAL 1 HOUR
您在IN()
中可能有多个值吗?如果没有,只需说
AND H = 'blah1'
AND I = 'blah2'
对于tbl2:
INDEX(J, K, -- in either order
TIME) -- last
对于tbl3:
INDEX(H, I, J, K, -- in any order
TIME) -- last
如果每个IN()
中只有一个元素,那么我给您的ORDER BY TIME
可以对INDEXes
进行操作,从而无需排序就可以使其更快。
IN()
中有更多元素时,索引仍然有用,但不能避免排序。
有关创建索引的更多信息:http://mysql.rjweb.org/doc.php/index_cookbook_mysql