диапазон создает список, поэтому если Вы делаете range(1, 10000000)
, он создает список в памяти с 9999999
элементы.
xrange
объект последовательности, который оценивает лениво.
Это должно быть добавлено от подсказки @Thiago, что в python3, диапазон делает эквивалент xrange
PythonПол:
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 не может быть извлечена из индекса, что приводит к сортировке файлов .
Ваш запрос, кажется, обрабатывает (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