2013-04-26 26 views
0

我目前正在開發一個MySQL存儲過程,我期待着速度略有增加。 但是,當我通過PHP腳本將它與SQL請求執行進行比較時,PHP速度更快。一個1000行的表格大約快10倍,而6000行的表格大約快兩倍。MySQL簡單選擇 - 存儲過程的性能

表的大小是否提高了程序的性能? 我在代碼中犯了一個錯誤,我可以優化它嗎?

我的配置是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 | 
+0

請勿使用遊標。 – Devart 2013-04-26 15:43:15

+0

如果只有一行使用SELECT INTO語句。 – Sebas 2013-04-26 18:14:05

回答

0

您寫入的存儲過程是完全不必要的。

您不僅需要CURSOR來返回結果集,您甚至不需要該過程,只需運行單個SELECT語句。

只需在您的PHP代碼中包含SELECT

1

我翻閱了你的建議並刪除了CURSOR和聲明。

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.0006s VS 0.009s以前0.0006 VS0.0012秒)的兩倍慢。

並看到存儲過程的代碼我明白你爲什麼說它沒用,但我會保留它,以強制數據庫用戶通過其網站中的功能和過程。我覺得這樣更安全。

非常感謝。

+0

在存儲過程中封裝一個'SELECT'似乎是不必要的複雜性和開銷,除非你想從表中SELECT [SELECT],用戶沒有'SELECT'權限(並且你使用'SQL SECURITY DEFINER')。 – 2013-05-03 15:21:31