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也没有那么严格。从中长期来看,你会感谢你没有去那里,特别是对于任何“商业”逻辑。