Mysql - это хороший оптимизированный запрос? - PullRequest
2 голосов
/ 04 марта 2012

Это может быть глупый вопрос. У меня более 30 миллионов записей.

Table 1

Column A(int) - Column B(Boolean) - Column C(int) - Column D(DateTime)

У меня будет составной индекс по (A, B, C, D).

Следующий запрос:

Select * from table1 where A=12 and B!=0 ORDER BY C DESC ,D ASC.

Поскольку Order by C DESC and D ASC невозможно. Я выполняю обратную сортировку, умножая C на (-1) каждый раз, когда вставляю запись.

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

Select * from table1 where A=12 and B!=0 ORDER BY C ASC ,D ASC.

Учитывая два критерия в предложении where и order by, будет ли этот запрос полностью использовать индексацию? Или есть другое лучшее решение?

Ответы [ 2 ]

4 голосов
/ 04 марта 2012

Существует очень полезная команда SQL, которая называется EXPLAIN.

Это именно так - объясняет, как СУБД будет подходить к вычислению запроса.

http://dev.mysql.com/doc/refman/5.0/en/explain.html

0 голосов
/ 05 марта 2012

Хранение негативов в столбце C, поэтому запрос с ORDER BY C DESC, D ASC можно изменить на ORDER BY C ASC, D ASC и использовать этот индекс - хорошая идея. Если у вас нет других запросов, требующих других заказов (ASC, ASC или DESC, DESC или DESC, ASC, то все в порядке.

Но я бы также изменил условие B != 0 на B = 1. Оптимизатор, возможно, не настолько умен, чтобы идентифицировать их как идентичные, и может не использовать индекс должным образом (или не использовать их вообще).

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