Как я могу оптимизировать индексирование столбца в таблице? - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь добавить индекс к моей базе данных MySQL, потому что в статистической базе данных, используемой системой, скорость запроса слишком низкая.

Требуется около 30 минут, чтобы вывести статистику за 1 минуту из более чем 50 000 кортежей

Сначала я пытался добавить индекс по столбцам, но это приводит к снижению производительности БД.Поскольку в запросе используется несколько столбцов, я должен использовать фактически используемые индексы.

Фактический запрос, который я использую, приведен ниже в простой версии.условие может измениться,

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 голосов
/ 04 июля 2019
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

0 голосов
/ 04 июля 2019

Индекс с несколькими столбцами обычно будет быстрее. Используйте дату для индекса (ов) с несколькими столбцами и одного или двух других столбцов, которые вы обычно используете для фильтрации своих данных. Если вы фильтруете свои данные по множеству различных столбцов, которые отличаются от запроса к запросу, вам придется создать такое количество индексов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...