понимание mysql объясняет

диапазон создает список, поэтому если Вы делаете range(1, 10000000), он создает список в памяти с 9999999 элементы.

xrange объект последовательности, который оценивает лениво.

Это должно быть добавлено от подсказки @Thiago, что в python3, диапазон делает эквивалент xrange

Python
19
задан Quassnoi 21 July 2009 в 22:54
поделиться

2 ответа

Пол:

eq_ref

Из этой таблицы считывается одна строка для каждой комбинации строк из предыдущих таблиц. За исключением типов system и const, это наилучший из возможных типов соединения. Он используется, когда все части индекса используются объединением, а индекс является индексом PRIMARY KEY или UNIQUE.

eq_ref можно использовать для индексированных столбцов, которые сравниваются с помощью оператора =. Значение сравнения может быть константой или выражением, использующим столбцы из таблиц, которые читаются перед этой таблицей. В следующих примерах MySQL может использовать соединение eq_ref для обработки ref_table:

SELECT * FROM ref_table,other_table
WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table
WHERE ref_table.key_column_part1=other_table.column
AND ref_table.key_column_part2=1;

ref

Все строки с совпадающими значениями индекса считываются из этой таблицы для каждой комбинации строк из предыдущих таблиц. ref используется, если в объединении используется только крайний левый префикс ключа или если ключ не является индексом PRIMARY KEY или UNIQUE (другими словами, если объединение не может выбрать одну строку на основе значения ключа) . Если используемый ключ соответствует только нескольким строкам, это хороший тип соединения.

ref можно использовать для индексированных столбцов, которые сравниваются с помощью оператора = или <=>. В следующих примерах MySQL может использовать соединение ref для обработки ref_table:

SELECT * FROM ref_table WHERE key_column=expr;

SELECT * FROM ref_table,other_table
WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table
WHERE ref_table.key_column_part1=other_table.column
AND ref_table.key_column_part2=1;

Они дословно скопированы из руководства MySQL: http://dev.mysql.com/doc/refman/5.0/en/using- объяснение.html

Если бы вы могли опубликовать свой запрос, который занимает вечно , я мог бы помочь точно определить, что его замедляет. Также укажите, каково ваше определение навсегда . Кроме того, если бы вы могли предоставить свой «SHOW CREATE TABLE xxx;» операторов для этих таблиц, я мог бы помочь максимально оптимизировать ваш запрос.

Что сразу бросается в глаза как возможное улучшение, так это «Использование временного; Использование файловой сортировки;». Это означает, что временная таблица была создана для удовлетворения запроса (что не обязательно плохо), и что указанная вами GROUP BY / ORDER BY не может быть извлечена из индекса, что приводит к сортировке файлов .

18
ответ дан 30 November 2019 в 04:40
поделиться

Ваш запрос, кажется, обрабатывает (244 * 298 * 152) = 11,052,224 записей, которые согласно Использование временных; При использовании файловой сортировки необходимо отсортировать.

Это может занять много времени.

Если вы разместите здесь свой запрос, мы, вероятно, сможем как-то его оптимизировать.

Обновление:

У вас действительно есть запрос. количество вложенных циклов и, кажется, дает множество значений, которые затем нужно отсортировать.

Не могли бы вы выполнить следующий запрос:

SELECT  COUNT(*)
FROM    `yourock_achievement`
INNER JOIN
        `yourock_achiever`
ON       `yourock_achievement`.`id` = `yourock_achiever`.`achievement_id`
INNER JOIN
        `yourock_alias`
ON      `yourock_achiever`.`alias_id` = `yourock_alias`.`id`
INNER JOIN
        `yourock_achiever` T4
ON      `yourock_alias`.`id` = T4.`alias_id`
INNER JOIN
        `yourock_achievement` T5
ON      T4.`achievement_id` = T5.`id`
INNER JOIN
        `yourock_achiever` T6
ON      T5.`id` = T6.`achievement_id`
WHERE
        T6.`alias_id` = 6
4
ответ дан 30 November 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: