Что ж, единственный способ ускорить выполнение запросов к индексам - это обеспечить, чтобы индексы покрывали достаточно условий, чтобы селективность стала полезной (или чтобы СУБД могла использовать индексы для вычисления агрегатов, таких как count).
Не забывайте, что наличие индекса на (Make)
и индекса на (BodyStyle)
равно , а не то же самое, что индекс на (Make, BodyStyle)
.
В вашем первом запросе, когда вам нужно сосчитать записи, наличия индекса, охватывающего default_image_URI
и VehicleLocation_province
, должно быть достаточно, чтобы mysql не выполнял сканирование таблицы, а извлекал счет из индекса.
Вы можете проверить это, создав индекс (VehicleLocation_province, default_image_URI)
, а затем запустив запрос и / или изучив объяснение.
Во втором запросе у вас аналогичная ситуация с запросом, который имеет больше условий (что хорошо, если они все являются условиями AND), и речь идет не о подсчете записей, а о фактическом извлечении данных из таблицы и сортировка .
Несколько замечаний здесь:
- обратите внимание на ваши условия
IS NOT NULL
и !=''
- если эти условия обычно присутствуют в ваших запросах, это говорит о том, что ваш дизайн не соответствует требованиям, и что вы денормализовали разные сущности в одну таблицу, так что теперь вам нужно их отсортировать каждый раз, когда вы хотите использовать данные (это всего лишь указание, и я предполагаю, что вы применяете эти условия много , что может не соответствовать действительности)
- сказав, что, если вы посмотрите на 2-й запрос и если Make и BodyStyle покрыты составным индексом и имеют низкую селективность, запрос все равно будет выполняться быстро
- mysql должен выбрать один индекс для доступа к данным, и он попытается выбрать индекс, который возвращает наименьшее количество строк с учетом статистики и доступных условий (так что дальнейшие условия должны пройти через наименьшее количество записей) - если этот индекс помогает только с уменьшением результирующего набора, сортировка будет выполняться с использованием файловой сортировки. Чтобы индекс был полезен как для выбора строк, так и для сортировки, он должен иметь полезный порядок или индексированные столбцы, например, в приведенном выше индексе запроса для
(Make, BodyStyle, VehicleReceivedDate)
может быть уловка
- Добавление правильных индексов в таблицу должно помочь, но индексы не могут исправить проблемы с дизайном