Индекс для столбца TIMESTAMP не используется при сравнении предложения WHERE с этим столбцом - PullRequest
0 голосов
/ 02 апреля 2019

Наличие двух таблиц, таких как:

FOO(ID, A, B, C, D, E, G(timestamp))
BAR(ID, X, Y, Z, FK_FOO_ID, W)

и index, таких как:

CREATE INDEX IDX_TEST ON FOO(G)

После запроса DESCRIBE будет не использовать созданный индекс:

DESC SELECT F.A, F.B, F.C, F.D, F.E,
  SUM(CASE WHEN B.X IN (0, 12) THEN B.Y ELSE 0.00 END) AS 'Something_1',
  SUM(CASE WHEN B.X IN (0, 12) THEN B.Z ELSE 0.00 END) AS 'Something_2',
  SUM(CASE WHEN B.X = 2 THEN B.Y ELSE 0.00 END) AS 'Something_3',
  SUM(CASE WHEN B.X = 2 THEN B.Z ELSE 0.00 END) AS 'Something_4'
FROM FOO AS F
INNER JOIN BAR AS B ON F.ID = B.FK_FOO_ID
WHERE
  (F.G > '2018-03-01 23:59:59' OR F.G IS NULL) AND
  B.W <= '2018-03-01 23:59:59' AND
  B.X IN (0, 2, 12)
GROUP BY
  F.A,
  F.B,
  F.C,
  F.D,
  F.E;

, но с удалением F.G > '2018-03-01 23:59:59' из предложения WHERE, созданный индекс будет применен .Есть идеи почему?Как заставить MYSQL использовать индекс для столбца G типа TIMESTAMP?Любые идеи для лучшего индекса для создания с этим типом SELECT запроса?

1 Ответ

0 голосов
/ 02 апреля 2019

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

В вашем случае при удалении FG> '2018-03-01 23: 59: 59 'условие, оставшееся условие - просто проверить, имеет ли значение null, что является более частым значением.

Более того, при проверке на ноль он не проверяет само значение в столбце, но имеет бит для каждой строки, который сообщает ему, является ли значение в столбце нулевым или нет.Так что это делает его еще быстрее.

когда вы добавляете условие обратно, вероятно, быстрее сначала найти соответствующий идентификатор, а затем проверить, соответствует ли G.

Он также будет использовать основнойключ, потому что он должен использовать его, чтобы получить значения для

F.A, F.B, F.C, F.D, F.E,

Если вы действительно хотите, чтобы он использовал ваш индекс, вам, вероятно, нужно сделать его покрывающим, то есть вам нужно добавить эти столбцык вашему индексу

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