Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Здравия желаю, товарищи!
Давно я здесь не бывал. +) Но возник вопрос.
Есть две таблицы:
Неактивен
Вы сортируете по вычисляемому полю, так что тут по любому будет filesort всего результата. Можно лишь вложенными запросами в части from заранее отсечь лишнее, т.е. вместо
tyres t
использовать
(select from tyres order by price limit X) t
Аналогично и для wheels
X подбирается с запасом, вдумчиво глядя на данные
Неактивен
+))) Спасибо за ответ. К сожалению сортировать по цене без связи по размеру не имеет смысла.
Это таблицы (в реальной жизни TEMPORARY) уже лимитированы по максимуму, в них остались только те данные, которые гарантируют корректное отображение 21 первых самых дешевых комплекта (колеса+диски). Общая таблица после соединения в среднем имеет 1-1,5 млн записей, бывает и 4-5 млн.
Может есть какая-то возможность отдельным запросом узнать данные, которые помогут ограничить количество записей еще больше?
Я рассматривал запрос типа
Неактивен
Тогда
Неактивен
Мысль примерно понимаю. Но как определить X ума пока не приложу. +))
Неактивен
Убрал UNION ALL, чтобы отбирались только уникальные строки. Добавил сортировку по ID товаров.
Странно, но когда я выставляю X = 21, все работает. И даже при разделении на страницы работает. X = 41, LIMIT 20,21 — результаты у обоих запросов одинаковы. +))
Теперь надо понять, где могут быть подводные камни. И надо просто осознать, почему все-таки работает.
Неактивен
Имхо, если сортировку по front и rear тоже использовать в подзапросах, то X=21.
Неактивен
Все работает. +)) Только не со временными таблицами.
Создание таблиц дубликатов занимает то время, которое потом экономится на новом объединяющем запросе.
Попа. +)))
Неактивен
Работает потому, что
X первых самых дешевых комплекта (колеса+диски)
это
X самых дешевых колес + связанные с ними диски
+
X самых дешевых дисков + связанные с ними колеса
сортируем по цене комплекта и LIMIT X
Имхо, подводных камней нет. И при разбивке на странице тоже будет работать корректно.
ALL действительно не нужен, это я лопухнулся
Неактивен
О каких таблицах дубликатов идет речь?
Вы подразумеваете подзапросы в части from, которые материализуются во временные таблицы или что-то другое?
Неактивен
Вася, когда все так красиво, это кажется нереальным. +))) Поэтому чисто психологически хочется найти косяк. Спасибо за помощь.
Остался вопрос, который меня мучает уже продолжительное время: Подзапрос в скобках отрабатывает быстрее, чем отдельный запрос на создание временной таблицы?
Неактивен
Я говорил о том, что таблицы tyres и wheels в реальной жизни TEMPORARY, поэтому MySQL не может их использовать дважды в одном запросе (Can't reopen). Я пытаюсь решить этот вопрос созданием двух временных таблиц из tyres2 = select from tyres order by price limit X и wheels2 = select from wheels order by price limit X.
Про сортировку («front и rear тоже использовать в подзапросах») я выше не написал, что так и сделал. +))
Неактивен
Александр Трофимов написал:
Остался вопрос, который меня мучает уже продолжительное время: Подзапрос в скобках отрабатывает быстрее, чем отдельный запрос на создание временной таблицы?
В принципе также.
При прочих равных запрос с подзапросом будет чуть быстрее, чем 2 запроса с явным созданием временной таблицы. Например, нет добавочных расходов на анализ и выполнение лишнего запроса.
Александр Трофимов написал:
Я говорил о том, что таблицы tyres и wheels в реальной жизни TEMPORARY, поэтому MySQL не может их использовать дважды в одном запросе (Can't reopen). Я пытаюсь решить этот вопрос созданием двух временных таблиц из tyres2 = select from tyres order by price limit X и wheels2 = select from wheels order by price limit X.
Да, иначе не получиться, а есть возможность в исходных TEMPORARY tyres сделать подходящий индекс для сортировки?
Неактивен
vasya написал:
Да, иначе не получиться, а есть возможность в исходных TEMPORARY tyres сделать подходящий индекс для сортировки?
Да, конечно, учитывая, что таблицы создаются отдельным запросом. А какой индекс будет правильным для сортировки?
vasya написал:
В принципе также.
При прочих равных запрос с подзапросом будет чуть быстрее, чем 2 запроса с явным созданием временной таблицы. Например, нет добавочных расходов на анализ и выполнение лишнего запроса.
Я попробовал. У меня MySQL на тестах показал увеличение скорости на треть минимум. Сейчас попробую переписать скрипт так, чтобы все временные таблицы создавались в подзапросах одного большого запроса и поглядим. +)
Неактивен
для
tyres2 = select from tyres order by price, front_tyre_id, rear_tyre_id limit X
нужен
INDEX (price, front_tyre_id, rear_tyre_id)
Неактивен
Александр Трофимов написал:
Я попробовал. У меня MySQL на тестах показал увеличение скорости на треть минимум. Сейчас попробую переписать скрипт так, чтобы все временные таблицы создавались в подзапросах одного большого запроса и поглядим. +)
А какая у вас версия MySQL?
Неактивен
vasya написал:
А какая у вас версия MySQL?
5.5.33 MariaDB
Я вложил все запросы в один большой. Разница в скорости генерации страницы 1.36782 sec (все вложенные) против 2.46771 sec (временные таблицы). При том, что я второй запрос запускал после первого (вдруг там чего попало в кеш).
Неактивен
И так результаты опытов. Время генерации страниц по три на каждый вариант.
Как было: 2.22763 sec | 1.17455 sec | 1.85758 sec
Один общий запрос: 0.69147 sec | 1.00500 sec | 0.98592 sec
Две временные таблицы: 0.84656 sec | 0.93798 sec | 1.02652 sec
Повторные генерации страниц много быстрее, наверняка из-за кеша.
И так, было явно плохо. +)) Один общий запрос в среднем вроде бы чуть быстрее работает, чем две временные таблицы. Допускаю, что из-за дополнительных ресурсов на отправку и оформление запросов. Так как скрипт работает на php, думаю, каждый запрос тратит время на общение php с mysql. Надо будет посмотреть в сторону множественных запросов из php.
Неактивен
В вашем случае подзапрос быстрее, ещё и потому, что MariaDB 5.5 умеет их хорошо готовить
Неактивен
Нет слов, одни слюни! +))) Я скрестил общий запрос с идеей временных таблиц (Один общий запрос + Две временные таблицы), т.е. получил один большой общий запрос с повторяющимися подзапросами. И скорость повысилась еще в двое. Выставлю здесь запрос, может кто увидит еще возможность улучшения в плане построения запроса. +)))
ЗЫ. Здесь видимо есть ограничение на длину сообщения. Мой запрос не прошел. +)) Кому интересно, см. в приложении.
Отредактированно Александр Трофимов (25.03.2015 01:04:10)
Неактивен
Возможно какие-то из повторяющихся подзапросов кэшируются. Можно выполнить
explain extended select ...
show warnings;
и посмотреть есть ли там куски со служебными словами <cache>, <temporary table>
Про сам запрос ничего не подскажу, так как его без пол литры не разобрать
Неактивен
я так понимаю для ORDER BY (column1+column2) DESC нельзя назначить индекс.
как же тогда оптимизировать такую сортировку?
Неактивен
хорошего способа нет. доп поле или пытаться уменьшить размер выборки (как по строкам, так и по полям), чтобы filesort был по небольшому объему.
Неактивен
Страниц: 1