如何优化表中的索引列?

时间:2019-07-04 08:47:46

标签: mysql database mariadb

我正在尝试向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)

哪个更好?为每列添加索引还是为多列添加索引?

2 个答案:

答案 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