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

У меня была таблица, которая содержит домен и идентификатор запрос

    select distinct domain 
    from user 
    where id = '1'

индекс использует порядок idx_domain_id быстрее, чем idx_id_domain

, если порядок исполнения

(предложение FROM, предложение WHERE, предложение GROUP BY, предложение HAVING, SELECT предложение, предложение ORDER BY)

тогда запрос должен быть быстрее, если он использует отсортированные столбцы where, чем select.

в таблице 4,6 млн строк.

время с использованием idx_domain_id time using idx_domain_id

время после изменения заказа time after change the order

Ответы [ 2 ]

0 голосов
/ 17 января 2019
select distinct domain 
from user 
where id = '1'

Поскольку id - это PRIMARY KEY, задействовано не более одной строки. Следовательно, ключевое слово DISTINCT бесполезно.

И самый полезный индекс - это то, что у вас уже есть, PRIMARY KEY(id). Он развернет BTree, чтобы найти id='1' и получить значение domain, которое находится прямо там.

С другой стороны, рассмотрим

select distinct domain 
from user 
where something_else = '1'

Теперь , очевидный индекс - INDEX(something_else, domain). Это оптимально для предложения WHERE, и оно «охватывает» (это означает, что все столбцы, необходимые для запроса, существуют в индексе). Обмен столбцов в индексе будет медленнее. Между тем, поскольку может быть несколько строк, DISTINCT что-то значит. Тем не менее, это не логичная вещь.

Относительно вашего заглавного вопроса (порядок столбцов): столбцы = в предложении WHERE должны стоять сначала . (Подробнее в ссылке ниже.)

DISTINCT означает собрать все строки, а затем дублировать их. Зачем столько усилий, если это дает тот же ответ:

select  domain 
from user 
where something_else = '1'
LIMIT 1

Это ударяет только по одной строке, а не по всем 1.

Прочитайте мою Указатель поваренной книги .

(И да, у Гордона много хороших моментов.)

0 голосов
/ 16 января 2019

Это ваш запрос:

select distinct first_name 
from user 
where id = '1';

Вы наблюдаете, что user(first_name, id) быстрее, чем user(id, firstname).

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

Во-вторых, если вы выполняете запросы только один раз, то при первом запуске запроса у вас может быть «холодный кэш». Во второй раз данные уже хранятся в памяти, поэтому они работают быстрее.

Могут возникнуть и другие проблемы. Вы не указываете, что такое время. Небольшие различия могут быть вызваны шумом и могут быть бессмысленными.

Вы не предоставили достаточно информации, чтобы дать более четкое объяснение. Это будет включать в себя:

  • Повторные тайминги запускаются на холодных тайниках.
  • Информация о размере таблицы и количестве совпадающих строк.
  • Информация о компоновке, особенно тип id.
  • Объясните планы по двум запросам.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...