Первое: запросы кешируются. Запуск их более одного раза, в основном, покажет вам, как быстро MySQL может получить свой предыдущий результат из кэша. Вы можете предотвратить это (немного), добавив SQL_NO_CACHE
после ключевого слова SElECT
.
Тогда хранимые процедуры работают так же быстро, как и код, который они выполняют. Если вы выполняете запрос внутри хранимой процедуры, он никогда не будет быстрее, чем просто запрос. Это все тот же запрос, но с некоторыми дополнительными затратами на выполнение хранимой процедуры.
Это может показаться быстрее, если вы не вернете данные из хранимой процедуры. Результат выполненного запроса отправляется вызывающей стороне. Если вы не сделаете этого в хранимой процедуре, скорость, которую вы наберете, просто из-за отправки меньшего количества данных.
Тогда запросы, которые вы выполняете в хранимой процедуре, не совпадают с отдельным запросом. В отдельном запросе вы вводите точное значение в строке запроса перед его отправкой в MySQL, в то время как в хранимой процедуре у вас фактически есть параметризованный запрос, в котором вы добавляете значение в качестве параметра в механизм mysql (хотя этот факт немного скрытый синтаксисом вызова запросов в хранимом процессе. Это означает, что вызов этой процедуры в первый раз заставляет MySQL снова анализировать этот запрос, в то время как версия с «постоянным значением» уже кэширована.
Итак, в заключение, ваш тест неверен.
Хранимая процедура работает на быстрее, если вам нужно выполнить некоторую обработку или фильтрацию, которую нельзя выполнить в одном запросе. Извлечение всех данных в PHP и их обработка там приводит к тому, что между PHP и MySQL пересылается слишком много данных. Если вы выполняете всю обработку в хранимой процедуре и отправляете только (небольшой) результат, это происходит быстрее, но в основном потому, что вся обработка остается внутри механизма SQL, поэтому сериализация / десериализация и отправка данных туда и обратно не выполняются.