Php 存储过程与预处理语句的MySQL性能比较

Php 存储过程与预处理语句的MySQL性能比较,php,mysql,sql,stored-procedures,database-performance,Php,Mysql,Sql,Stored Procedures,Database Performance,这是我准备好的声明 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 '201

这是我准备好的声明

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
        )

)
我仔细研究了执行时间,两者都是一样的。何时何地一个比另一个更好更快?

“更快”和“更好”不一定一致。请看这样的问题,并考虑解决方案的这些属性:

  • 可维护性(可读性、技能要求-谁能处理此代码)
  • 可测试
  • 可发布
  • 灵活的
  • 便携式

一般来说,存储过程更快,但在其他指标上都会失败。

我认为在您的情况下,独立运行查询或作为存储过程的一部分运行查询并不重要。在需要执行查询批处理的情况下,过程很好。因此,对于您的查询,最好是单独运行。

是的,但也要考虑完整性和安全性。存储过程在这些指标上获胜。存储过程可以具有不同于表的访问权限。例如,这意味着您可以拒绝对表的访问,除非通过存储过程实现的定义良好的方式。此外,您还可以排除大多数意外或草率无效/不一致数据的情况。最后,成功利用调用存储过程的脚本比将原始SQL发送到DB服务器要困难得多(不是说这不可能,但肯定要困难得多);他们很少自己做(在应用程序用户级别)。此外,PL/SQL是一种比应用程序编程更为罕见的技能,坦率地说,IMHO也没有那么严格。从中长期来看,你会感谢你没有去那里,特别是对于任何“商业”逻辑。