metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-12-16 09:43 am

Prepare запросов

Использование MySQL как NoSQL

Они там в начале профилируют выполнение поиска по первичному ключу в MySQL (в противовес летающему memcached) и у меня мозг споткнулся на следующей фразе:
MYSQLparse() и MYSQLlex() были вызваны в процессе разбора SQL запроса. make_join_statistics() и JOIN::optimize() были вызваны в фазе оптимизации запроса. Это и есть "SQL-оверхед".

Это, простите, как? Запрос для поиска по первичному ключу парсится и препарится каждый раз заново, использовать подготовленные заранее запросы невозможно или авторы этого не знают?

[identity profile] plumqqz.livejournal.com 2010-12-16 07:56 am (UTC)(link)
Это, простите, как? Запрос для поиска по первичному ключу парсится и препарится каждый раз заново, использовать подготовленные заранее запросы невозможно или авторы этого не знают?

Similis simili gaudet, не понимаю, что Вас удивляет.

[identity profile] molnij.livejournal.com 2010-12-16 08:41 am (UTC)(link)
Если запускается с параллельных потоков в разных сессиях, то не факт, что удастся использовать. Собственно они и сделали в результате промежуточный слой, который держал соединение и позволял использовать один и тот же разобранный запрос.

[identity profile] metaclass.livejournal.com 2010-12-16 08:54 am (UTC)(link)
Ага, как их промежуточный слой работает с транзакциями и ссылочной целостностью, вопрос совершенно отдельный.
И даже с параллельных потоков - лучше 100 одинаковых отпрепаренных запросов на 100 потоков, выполняющиеся по 1000 раз в секунду, чем 100000 раз парсить и выполнять запросы.

[identity profile] molnij.livejournal.com 2010-12-16 09:18 am (UTC)(link)
Ну разумеется отдельный :) Хотя, когда встает вопрос о выжимании последних соков, иногда и на грязное чтение как-то подзабивают (впрочем, уже от задачи зависит).
Естественно, что лучше 100 отпрепаренных запросов. Но это вопрос к конкретному приложению. Рассматриваемый пример несколько искусственен. Не знаю тонкостей мускула и использованных тулз, но могу предположить, что после второго запроса там уже все из кеша бралось по факту, так что измерялась очень вакуумно-сферическая величина, в которой естественно первое место занял парс.

[identity profile] gds.livejournal.com 2010-12-16 09:27 am (UTC)(link)
раньше mysql не умел prepared statements. Клиент склеивал sql, слал на сервер, так всё и работало. Интересно, это уже поправили, или как раз это связано с обсуждаемой проблемой?

[identity profile] basanov.livejournal.com 2010-12-16 08:31 pm (UTC)(link)
Кстати да. Не знал, что Мускуль умеет препарить стейтменты. =) Помнится действительно клеил и вообще.