Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL简单选择-存储过程性能_Mysql_Performance_Stored Procedures - Fatal编程技术网

MySQL简单选择-存储过程性能

MySQL简单选择-存储过程性能,mysql,performance,stored-procedures,Mysql,Performance,Stored Procedures,我目前正在MySQL上开发一个存储过程,我希望速度会略有提高。 但当我将其与通过PHP脚本执行SQL请求进行比较时,PHP速度更快。1000行表格快10倍,6000行表格快2倍 表格大小是否改善了程序性能? 我是否在代码中犯了错误,我可以优化它吗 我的配置是MySQL 5.0.10上的MyIsam引擎。 我的存储过程是 CREATE PROCEDURE get_task (IN var INT) BEGIN DECLARE id_task INT (11); DECLARE j

我目前正在MySQL上开发一个存储过程,我希望速度会略有提高。 但当我将其与通过PHP脚本执行SQL请求进行比较时,PHP速度更快。1000行表格快10倍,6000行表格快2倍

表格大小是否改善了程序性能? 我是否在代码中犯了错误,我可以优化它吗

我的配置是MySQL 5.0.10上的MyIsam引擎。 我的存储过程是

CREATE PROCEDURE  get_task (IN var INT)
BEGIN
    DECLARE id_task INT (11);
    DECLARE job INT (11);
    DECLARE state_name VARCHAR(20);
    DECLARE task_name VARCHAR(20);
    DECLARE worker_affected INT(11);
    DECLARE user VARCHAR(10);
    DECLARE progress INT(11);
    DECLARE name VARCHAR(128);
    DECLARE phone VARCHAR(128);
    DECLARE mobile VARCHAR(128);
    DECLARE site VARCHAR(32);
    DECLARE worker_name VARCHAR(20);
    DECLARE date_time_process_started DATETIME;
    DECLARE frame INT(11);

    DECLARE curseur1 CURSOR FOR 

    SELECT tq.`id_task`, tq.`job`, lts.`state_name`, ltt.`task_name`, tq.`worker_affected`, j.`user`, tq.`progress`, u.`name`, u.`phone`, u.`mobile`, u.`site`, w .`worker_name`, tq.`date_time_process_started`, tq.`frame`
    FROM `task_queue` tq
    LEFT JOIN `workers` w ON tq.`worker_affected` = w.`id_worker`
            INNER JOIN `job` j ON tq.`job` = j.`job_id`
            INNER JOIN `user` u ON j.`user` = u.`ipn`
            INNER JOIN `list_task_type` ltt ON tq.`task_type` = ltt.`id_type_task`
            INNER JOIN `list_task_state` lts ON tq.`task_state` = lts.`id_state`
    WHERE tq.`id_task` =  var 
    ORDER BY tq.`id_task`;

    OPEN curseur1;

    FETCH curseur1 INTO id_task, job, state_name, task_name, worker_affected, user, progress, name, phone, mobile, site, worker_name, date_time_process_started, frame;
    SELECT id_task, job, state_name, task_name, worker_affected, user, progress, name, phone, mobile, site, worker_name, date_time_process_started, frame;

    CLOSE curseur1;

END |

您编写的存储过程完全没有必要

返回结果集不仅不需要
光标
,甚至不需要过程,只需运行单个
SELECT
语句即可


只需在PHP代码中包含
SELECT

我按照您的建议删除了光标和声明

CREATE PROCEDURE  get_task (IN var INT)
BEGIN

SELECT tq.`id_task`, tq.`job`, lts.`state_name`, ltt.`task_name`, tq.`worker_affected`, j.`user`, tq.`progress`, u.`name`, u.`phone`, u.`mobile`, u.`site`, w .`worker_name`, tq.`date_time_process_started`, tq.`frame`
FROM `task_queue` tq
LEFT JOIN `workers` w ON tq.`worker_affected` = w.`id_worker`
        INNER JOIN `job` j ON tq.`job` = j.`job_id`
        INNER JOIN `user` u ON j.`user` = u.`ipn`
        INNER JOIN `list_task_type` ltt ON tq.`task_type` = ltt.`id_type_task`
        INNER JOIN `list_task_state` lts ON tq.`task_state` = lts.`id_state`
WHERE tq.`id_task` =  var 
ORDER BY tq.`id_task`;


END |
事实上,性能突飞猛进,现在我的存储过程只比PHP脚本慢了两倍(0.0006 vs 0.0012秒,而之前是0.0006 vs 0.009s)

看到存储过程的代码,我理解你为什么说它没用,但我会保留它,以便迫使数据库用户通过其网站中的函数和过程。我觉得这样更安全


非常感谢。

如果只有一行,请使用SELECT INTO语句。在存储过程中封装一个
SELECT
,这似乎是不必要的复杂性和开销,除非您希望
SELECT
从用户没有
SELECT
权限的表中进行选择(并且您使用
SQL安全定义器
)。