Разделение игнорируется SELECT? - PullRequest
1 голос
/ 28 января 2020

Я разбил огромный массив данных, используя метод HA SH для YEAR ('datetimestamp'), с 30 разделами.

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

SELECT * FROM 'mytable' WHERE user_id=100 AND YEAR(datetimestamp) = 2019;

Использование EXPLAIN FORMAT = JSON показывает, что на самом деле кажется, что рассматриваются 30 разделов, а не только правильные.

Что я сделал не так?

PS - я могу повысить производительность, не занимаясь разделами, а вместо этого добавив новый ключ INDEX с помощью (user_id и datetimestamp). Я боюсь, что через несколько лет размер будет настолько большим, что наличие разделов действительно поможет сократить время запроса.

1 Ответ

2 голосов
/ 28 января 2020

Проще говоря, PARTITION BY HASH не дает никаких преимуществ в производительности. Или любую другую выгоду, которую я нашел. И, как вы обнаружили, HASH имеет тенденцию смотреть на все разделы.

Итак, что же делать вместо этого? Для этого:

SELECT * FROM `mytable`
    WHERE user_id = 100
      AND YEAR(datetimestamp) = 2019;

do:

  • Без разделения;
  • Измените YEAR тест на

    AND datetimestamp >= '2019-01-01'
    AND datetimestamp  < '2019-01-01' + INTERVAL 1 YEAR
    
  • И имеют

    INDEX(user_id, datetimestamp)
    

Таким образом, он будет выполнять простое сканирование диапазона индекса.

YEAR(...) is not " sargeable ", но моя формулировка выше.

...