Оптимизировать запрос по порядку столбцов в индексе

Вы можете использовать эту функцию с помощью Anaconda Package .

enter image description here [/g2]

Anaconda включает в себя гораздо больше функций, чем просто авто completetion. Вы можете установить пакет Jedi Package . Это автоматическое завершение, которое поставляется с Anaconda.

0
задан abdoutelb 16 January 2019 в 11:58
поделиться

2 ответа

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

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

Вы замечаете, что user(first_name, id) быстрее, чем user(id, firstname).

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

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

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

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

  • Повторные тайминги работают на холодных кешах.
  • Информация о размере таблицы и количестве совпадающих строк.
  • Информация о компоновке, особенно тип id.
  • Объясните планы по двум запросам.
0
ответ дан Gordon Linoff 16 January 2019 в 11:58
поделиться
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
ответ дан Rick James 16 January 2019 в 11:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: