Создание более быстрого MySQL Query - PullRequest
2 голосов
/ 25 июня 2009

Я пытаюсь создать более быстрый запрос, сейчас у меня большие базы данных. Размеры моей таблицы - 5 строк, 530 тыс. Строк и 300 строк, 4 тыс. Строк (к сожалению, у меня 0 контроля над архитектурой, иначе у меня не было бы этой глупой проблемы с плохой базой данных).

SELECT  cast( table2.foo_1 AS datetime ) as date,
        table1.*, table2.foo_2, foo_3, foo_4, foo_5, foo_6, foo_7, foo_8, foo_9, foo_10, foo_11, foo_12, foo_13, foo_14, foo_15, foo_16, foo_17, foo_18, foo_19, foo_20, foo_21
FROM    table1, table2
WHERE   table2.foo_0 = table1.foo_0
        AND table1.bar1 >= NOW()
        AND foo_20="tada"
ORDER BY
        date desc
LIMIT   0,10

Я проиндексировал table2.foo_0 и table1.foo_0 вместе с foo_20 в надежде, что это позволит ускорить выполнение запросов .. У меня все еще почти 7 секунд загрузки ... Есть ли что-то еще, что я могу сделать? 1004 *

Приветствия

Ответы [ 5 ]

3 голосов
/ 25 июня 2009

Я думаю, что индекс на bar1 является ключевым. Я всегда сталкиваюсь с проблемами производительности с датами, потому что нужно сравнить каждую из строк 530K.

2 голосов
/ 25 июня 2009

Создайте следующие индексы:

CREATE INDEX ix_table1_0_1 ON table1 (foo_1, foo_0)
CREATE INDEX ix_table2_20_0 ON table2 (foo_20, foo_0)

и перепишите ваш запрос следующим образом:

SELECT  cast( table2.foo_1 AS datetime ) as date,
        table1.*, table2.foo_2, foo_3, foo_4, foo_5, foo_6, foo_7, foo_8, foo_9, foo_10, foo_11, foo_12, foo_13, foo_14, foo_15, foo_16, foo_17, foo_18, foo_19, foo_20, foo_21
FROM    table1
JOIN    table2
ON      table2.foo_0 = table1.foo_0
        AND table2.foo_20 = "tada"
WHERE   table1.bar1 >= NOW()
ORDER BY
        table1.foo_1 DESC
LIMIT   0, 10

Первый индекс будет использоваться для ORDER BY, второй будет использоватьсядля JOIN.

Однако вы можете получить больше пользы от создания первого индекса, подобного следующему:

CREATE INDEX ix_table1_0_1 ON table1 (bar, foo_0)

, который может применить более строгую фильтрацию к bar.

У меня есть запись в блоге по этому вопросу:

, который дает советы о том, как выбратьИндекс, создаваемый для подобных случаев.

1 голос
/ 25 июня 2009

Индексирование table1.bar1 может улучшить сравнение> = NOW. Составной индекс на table2.foo_0 и table2.foo_20 поможет. Индекс на table2.foo_1 может помочь сортировке.

В целом, вставка результата запроса с добавлением EXPLAIN может также дать некоторые подсказки.

0 голосов
/ 25 июня 2009

Индекс на table1.foo_0, table1.bar1 тоже может помочь, предполагая, что foo_20 принадлежит table1.

См. Как использовать индексы MySQL и Оптимизация запросов с объяснением .

Используйте составные индексы, которые соответствуют равенствам WHERE (в общем, крайнему левому столбцу в индексе), сравнению WHERE с абсолютным значением (в середине) и предложению ORDER BY (справа, в том же порядке).

0 голосов
/ 25 июня 2009

table2 нужен составной индекс для foo_0, foo_20 и bar1.

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