【问题标题】:MySQL performance comparison between Stored Procedure and Prepared Statements存储过程和准备语句之间的 MySQL 性能比较
【发布时间】:2011-09-16 22:44:47
【问题描述】:

这是 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
        )

)

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

【问题讨论】:

    标签: php mysql sql stored-procedures database-performance


    【解决方案1】:

    “更快”和“更好”不一定是一致的。请参阅this recent similar SO 问题,并考虑解决方案的这些属性:

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

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

    【讨论】:

    • 可以,但也要考虑完整性和安全性。存储过程在这些指标上获胜。存储过程可以具有与表不同的访问权限。这意味着您可以例如拒绝对表的访问,除非通过存储过程实现的明确定义的方式。此外,您可以排除大多数意外或草率的无效/不一致数据的情况。最后,要成功利用调用存储过程的脚本而不是将原始 SQL 发送到数据库服务器要困难得多(不是说不可能,但肯定要困难得多)。
    • 当然——你说的一切都是真的,但是 PL/SQL 太难维护和调试等等。大多数数据库推迟了对用户访问操作系统/应用程序的控制;他们很少自己做(在应用程序用户级别)。此外,PL/SQL 是一种比应用程序编程更稀有的技能,坦率地说,恕我直言不那么自律。从中/长期来看,你会庆幸你没有去那里,尤其是对于任何“商业”逻辑。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多