【问题标题】:How Can I optimize indexing column in table?如何优化表中的索引列?
【发布时间】:2019-07-04 08:47:46
【问题描述】:

我正在尝试向我的 MySQL 数据库添加索引,因为系统使用的统计数据库中查询速度太慢。

1 分钟统计超过 50,000 个元组大约需要 30 分钟

起初,我尝试为每列添加一个索引,但这会导致数据库性能下降。因为查询使用了多列,所以我应该使用实际使用的索引。

我使用的实际查询是下面的简单版本。 条件可以改变,

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)

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

【问题讨论】:

    标签: mysql database mariadb


    【解决方案1】:

    具有多列的索引通常会更快。将日期用于多列索引以及您通常用于过滤数据的一两个其他列。如果您使用大量不同的列过滤数据,这些列因查询而异,您将不得不创建那么多索引。

    【讨论】:

      【解决方案2】:
      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

      【讨论】:

      • 你的意思是如果我把时间列放在索引中,我不是必须使用 ORDER BY TIME 吗?
      • @반애솔 - 不,保留ORDER BY。我的意思是优化器不需要做任何额外的努力来提供TIME order 中的结果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2015-07-05
      • 2012-07-23
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多