Ускорение запроса 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 делает это самостоятельно.

С предоставленной информацией

  1. Таблица содержит улицы, почтовые индексы, зону, район и город.
  2. Вы просматриваете почтовые индексы и не интересуетесь улицами (поэтому вы не выбрали бы FIELD5 в своем примере, как я теперь понимаю).
  3. Вы не можете изменить дизайн таблицы, но вы можете добавить индексы.

у вас должен быть индекс на TOWN + NEIGHBORHOOD + ZONE + PC. Он содержит всю необходимую вам информацию и указывает на все связанные улицы. БД должны быть достаточно умными, чтобы заметить, что доступ к таблице не требуется, так как все необходимые данные присутствуют в индексе. Это должно значительно ускорить ваш запрос.

  1. Вы упоминаете, что используете индексы, убедитесь, что индекс содержит все поля, которые вы упоминаете в вашем выборе
  2. может быть так, что он возвращает только 30 строк, но из-за

    ГРУППА ПО ПОЛЕ1

так что вы можете захотеть "затянуть" ваш запрос, добавив "LIMIT XX", "SELECT DISTINCT FIELD 1" и т. д.

Я предлагаю вам взглянуть на реализацию стратегии разделения. Для больших столов это единственный способ значительно улучшить производительность.

Читайте здесь: https://dev.mysql.com/doc/refman/5.1/en/partitioning.html

Другие вопросы по тегам