Моя ситуация:Использование на стороне сервера MySQL подготовленное заявление для повышения производительности приложений
- MySQL 5.5, но можно перейти на 5,7
- Наследство приложение выполняет один запрос MySQL, чтобы получить некоторые данные (1-10 строк , 20 столбцов)
- Запрос может быть изменен с помощью конфигурации приложения
- запрос очень сложный SELECT, с несколькими ПРИСОЕДИНЯЕТСЯ и условий, речь идет о 20KB кода
- запросов хорошо профилированные, использование индекса F ine-tuned, я потратил много времени на это и не имел возможности для улучшения без разделения на более мелкие запросы
- С традиционным приложением я бы разбил этот большой запрос на несколько меньших и использовал кеширование, чтобы избежать многих JOINS, но мое устаревшее приложение не позволяют это сделать. Я могу использовать только один запрос для возврата результатов
Мой план повышения производительности является:
- Сокращение времени разбора. Разбор 20 Кбайт SQL при каждом запросе, в то время как изменяются только значения параметров
- Я хотел бы включить этот запрос в подготовленный оператор и заполнить заполнители данными только
- Запрос будет разобран один раз и выполнен несколько раз, должен гораздо быстрее
проблемы/вопросы:
- прежде всего: делает выше решение имеет смысл?
- Готовые заявления MySQL, похоже, связаны с сеансом. Я не могу использовать это, поскольку я не могу выполнить какой-либо дополнительный код («код инициализации») для создания операторов для каждого сеанса.
- Другое решение, которое я вижу, - это использовать подготовленную инструкцию, сгенерированную внутри процедуры или функции. Но примеры, которые я видел, полагаются на динамическое генерирование запросов с использованием CONCAT() и создание подготовленного оператора, выполняемого локально внутри процедуры. Похоже, что такие заявления будут подготовлены при каждом вызове процедуры, поэтому он не будет экономить время обработки.
- Есть ли способ объявить готовый оператор в масштабе всего сервера, а не сеанса, связанный с MySQL? Так они выживут перезапуск приложения и перезапуск сервера?
- Если нет, можно ли кэшировать подготовленные заявления, объявленные в функциях/процедурах?