0

Моя ситуация:Использование на стороне сервера MySQL подготовленное заявление для повышения производительности приложений

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

Мой план повышения производительности является:

  • Сокращение времени разбора. Разбор 20 Кбайт SQL при каждом запросе, в то время как изменяются только значения параметров
  • Я хотел бы включить этот запрос в подготовленный оператор и заполнить заполнители данными только
  • Запрос будет разобран один раз и выполнен несколько раз, должен гораздо быстрее

проблемы/вопросы:

  • прежде всего: делает выше решение имеет смысл?
  • Готовые заявления MySQL, похоже, связаны с сеансом. Я не могу использовать это, поскольку я не могу выполнить какой-либо дополнительный код («код инициализации») для создания операторов для каждого сеанса.
  • Другое решение, которое я вижу, - это использовать подготовленную инструкцию, сгенерированную внутри процедуры или функции. Но примеры, которые я видел, полагаются на динамическое генерирование запросов с использованием CONCAT() и создание подготовленного оператора, выполняемого локально внутри процедуры. Похоже, что такие заявления будут подготовлены при каждом вызове процедуры, поэтому он не будет экономить время обработки.
  • Есть ли способ объявить готовый оператор в масштабе всего сервера, а не сеанса, связанный с MySQL? Так они выживут перезапуск приложения и перезапуск сервера?
  • Если нет, можно ли кэшировать подготовленные заявления, объявленные в функциях/процедурах?

ответ

0

Я думаю следующее добьется своей цели ...

  • Поместите монстр в сохраняемом Routine.
  • Упорядочить, чтобы всегда выполнять эту хранимую процедуру с . соединение. (Это может включать реструктуризацию своего клиента и/или вставки «веб-сервис» в середине.)

Логика здесь в том, что Хранимые Подпрограммы составляются один раз в связи. Я не знаю, включает ли это кеширование «подготовки».Я также не знаю, следует ли оставить запрос голым или искусственно подготовить & выполнить.

Предложите вам попробовать некоторые тайминги, а также попробуйте профилирование. Последнее может дать вам подсказки, в чем я не уверен.