Сравнение производительности MySQL между хранимой процедурой и подготовленными операторами - PullRequest
2 голосов
/ 17 июня 2011

Вот подготовленное MySQL заявление

SELECT 
    ag.`attendance_type`,
    ag.`description`,
    COUNT(a.`attendance`) attendance_count 
FROM
    `ems_attendance` a 
    RIGHT JOIN `ems_att_group` ag 
        ON ag.`id` = a.`attendance` 
        AND a.`added_date` BETWEEN '2011-06-01' 
        AND '2011-06-17' 
        AND a.`users_id` = '9' 
GROUP BY a.`attendance` 
ORDER BY ag.`id`;

и эквивалентная процедура хранения

DELIMITER $$

DROP PROCEDURE IF EXISTS `users_attendance_report` $$

CREATE PROCEDURE `users_attendance_report` (
    IN users_id INT,
    IN start_date DATE,
    IN end_date DATE
) 
BEGIN
    SELECT 
        ag.`attendance_type`,
        ag.`description`,
        COUNT(a.`attendance`) attendance_count 
    FROM
        `ems_attendance` a 
        RIGHT JOIN `ems_att_group` ag 
            ON ag.`id` = a.`attendance` 
            AND a.`added_date` BETWEEN start_date 
            AND end_date 
            AND a.`users_id` = users_id 
    GROUP BY a.`attendance` 
    ORDER BY ag.`id` ;
END $$

DELIMITER;

После выполнения запроса оба результата выдают одинаковые результаты.

Array
(
    [0] => stdClass Object
        (
            [attendance_type] => present
            [description] => Present
            [attendance_count] => 10
        )

    [1] => stdClass Object
        (
            [attendance_type] => absent
            [description] => Absent
            [attendance_count] => 2
        )

    [2] => stdClass Object
        (
            [attendance_type] => other
            [description] => Other
            [attendance_count] => 0
        )

    [3] => stdClass Object
        (
            [attendance_type] => dayoff
            [description] => Day Off
            [attendance_count] => 2
        )

)

Я внимательно смотрю на время выполнения, оба одинаковы. Когда и где один лучше и быстрее другого?

Ответы [ 2 ]

4 голосов
/ 17 июня 2011

«Быстрее» и «лучше» не обязательно выровнены.Пожалуйста, посмотрите этот недавний похожий SO вопрос и рассмотрите следующие атрибуты решения:

  • ремонтопригодны (читаемые, требования к навыкам - кто может работать с этим кодом)
  • тестируемый
  • высвобождаемый
  • гибкий
  • переносимый

Вообще говоря, хранимые процедуры быстрее, но терпят неудачу в любой другой метрике.

2 голосов
/ 17 июня 2011

Я думаю, что в вашем случае не имеет значения, выполняете ли вы запрос автономно или как часть хранимой процедуры. Процедура хороша в ситуациях, когда вам нужно выполнить пакет запроса. Поэтому для вашего запроса лучше всего запустить автономно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...