Ускорение запроса MySQL
У меня есть этот запрос:
SELECT
FIELD1, FIELD2, FIELD3, FIELD4, FIELD5
FROM
MYTABLE
WHERE
FIELD1 = .... AND
FIELD2 = .... AND
FIELD3 = ....
GROUP BY
FIELD4
;
Обратите внимание, что единственное, что я изменил, - это имена полей и таблицы. Мой запрос имеет 5 полей в SELECT
заявление и 1 таблица в FROM
раздел. WHERE
и GROUP BY
разделы также выглядят именно так: 3 поля с условием равенства.
Поля FIELD1
, FIELD2
а также FIELD3
являются как PK, так и индексы.
Проблема: выполнение запроса занимает почти 8 секунд (и возвращает около 30 строк).
Вопрос: есть ли способ ускорить запрос, который не связан с сервером (увеличение кэша, запуск базы данных на более мощном сервере и т. Д.)?
РЕДАКТИРОВАТЬ:
Объявление полей:
FIELD1: VARCHAR(2)
FIELD2: VARCHAR(3)
FIELD3: VARCHAR(7)
FIELD4: VARCHAR(4)
FIELD5: VARCHAR(5)
РЕДАКТИРОВАТЬ 2:
Выход из SHOW INDEX
: http://ibin.co/1LSSwvr0CVpX
РЕДАКТИРОВАТЬ 3:
Выход из EXPLAIN
:
select_type: SIMPLE
table: MYTABLE
type: ALL
possible_keys:
key:
key_len:
ref:
rows: 2081601
Extra: Using where; Using temporary; Using filesort
РЕДАКТИРОВАТЬ 4:
Пример данных:
Chicago = 1 (neighborhoods 001, 002, 003) (neighborhood zone 1, 2, 3) (postal code 10, 20, 30)
NY = 2 (neighborhoods 001, 002, 003) (neighborhood zone 1, 2, 3)(postal code 10, 20, 30)
Los Angeles = 3 (neighborhoods 001, 002, 003) (neighborhood zone 1, 2, 3)(postal code 10, 20, 30)
Данные
1 001 1 10
1 002 1 10
1 002 1 20
1 002 2 20
1 003 1 30
2 001 1 10
2 002 1 20
3 001 1 10
3 002 1 10
3 002 2 20
Что я делаю:
Поиск всех почтовых индексов, которые соответствуют TOWN == 1 (Чикаго) И Соседства == 001 И ZONE == 1, а затем GROUP BY почтовый индекс. Я надеюсь, что это ясно дает понять.
4 ответа
Кажется, проблема с вашим методом поиска просто заключила ваши значения, такие как field1='value', так как это varchar, и вы используете без кавычек. По этому ваш запрос будет использовать индекс, и вы получите производительность.
Примечание. Нет необходимости использовать index, поскольку mysql делает это самостоятельно.
С предоставленной информацией
- Таблица содержит улицы, почтовые индексы, зону, район и город.
- Вы просматриваете почтовые индексы и не интересуетесь улицами (поэтому вы не выбрали бы FIELD5 в своем примере, как я теперь понимаю).
- Вы не можете изменить дизайн таблицы, но вы можете добавить индексы.
у вас должен быть индекс на TOWN + NEIGHBORHOOD + ZONE + PC. Он содержит всю необходимую вам информацию и указывает на все связанные улицы. БД должны быть достаточно умными, чтобы заметить, что доступ к таблице не требуется, так как все необходимые данные присутствуют в индексе. Это должно значительно ускорить ваш запрос.
- Вы упоминаете, что используете индексы, убедитесь, что индекс содержит все поля, которые вы упоминаете в вашем выборе
может быть так, что он возвращает только 30 строк, но из-за
ГРУППА ПО ПОЛЕ1
так что вы можете захотеть "затянуть" ваш запрос, добавив "LIMIT XX", "SELECT DISTINCT FIELD 1" и т. д.
Я предлагаю вам взглянуть на реализацию стратегии разделения. Для больших столов это единственный способ значительно улучшить производительность.
Читайте здесь: https://dev.mysql.com/doc/refman/5.1/en/partitioning.html