2013-02-22 2 views
1

Есть ли правило запроса о том, что лучше всего фильтровать, чтобы получить лучшую производительность? Пример:Выполнение запросов mysql: позиция поля

SELECT * FROM table WHERE date <= '2012-08-01' AND random_field = 4684 AND primary_field = 355 

против

SELECT * FROM table WHERE random_field = 4684 AND primary_field = 355 AND date <= '2012-08-01' 

Что быстрее? Будет ли позиция размещения предложения поля where в запросе влиять на производительность? Следует сравнить

  • начальное поле сначала?
  • с индексированным полем сначала?
  • целое поле сначала?
  • дата поле сначала?
  • строка поле сначала?
  • Поле подзапроса сначала?

Есть ли какое-нибудь хорошее популярное руководство по запросам mysql, о котором вы знаете?

+1

Порядок совершенно не имеет значения. Вы можете использовать EXPLAIN, чтобы узнать, что mysql будет использовать для получения записей из индекса. – Vatev

+0

Наденьте его на [CodeReview] (http://codereview.stackexchange.com/) или [DBA SE] (http://dba.stackexchange.com/). – hjpotter92

ответ

2

Порядок, согласно которому условия в разделе WHERE не имеет значения. Важно то, что индексы у вас на столе.

Для этого запроса:

SELECT * 
FROM table 
WHERE random_field = 4684 
    AND primary_field = 355 
    AND date <= '2012-08-01' ; 

хорошие показатели являются либо (random_field, primary_field, date) или: (primary_field, random_field, date).

Почему? Поскольку столбцы (random_field, primary_field), которые имеют условия равенства, помещаются сначала в индекс, а затем в столбец (date) с условием диапазона.


Название primary_field довольно странно. Если это действительно PRIMARY KEY таблицы (или если у нее есть ограничение UNIQUE - и, следовательно, уникальный индекс), это все, что вам нужно для этого запроса. Этот (первичный или уникальный) индекс является таким же избирательным, как указанные выше индексы. Условие будет соответствовать не более одной строке из-за primary_field = @constant, поэтому нет необходимости в дополнительных индексах.

+0

Также, если у вас PRIMARY_KEY = CONST в вашем состоянии WHERE, не имеет значения, какие у вас другие индексы. – Vatev

+0

@Vatev: Да, обновил ответ. –

+0

Вы правы, первичного сравнения достаточно, но это просто для примера, замените его indexed_field, каков будет результат? –

0

мы должны следовать некоторым правилам

1. comparison of primary fields should come first and then indexed (because this will filter out required value) 
2. Date or range wise (example 2<id<6) should come at the end. 
+0

Ответ кажется логичным. Но мне нужен какой-то хорошо документированный справочник, поскольку каждый человек говорит другой ответ. Пусть голосование пользователя –

Смежные вопросы