2016-04-26 51 views
0

我有以下查詢需要時間。 Mytable類型是innodb,並且在字段上有主鍵tsh_id 我還在transaction_Id字段中添加了索引Mysql innodb查詢返回緩慢的結果

以下是我的數據庫存儲過程中的實現。

DECLARE lv_timestamp DATETIME(3); 
    SET @lv_timestamp = NOW(3); 

    IF(mycondition) then  
     SET @lv_Duration :=(SELECT UNIX_TIMESTAMP (@lv_timestamp) - UNIX_TIMESTAMP (`changedon`) 
     FROM `MyTable`   
     WHERE transaction_Id = _transaction_Id   
     ORDER BY tsh_id DESC 
     LIMIT 1)   
    End if; 

請提出諸如此類的改良

編輯:

解釋到查詢說

"select_type":"SIMPLE", 
"table":"MyTable", 
"type":"ref", 
"possible_keys":"IX_MyTable_Transaction", 
"key":"IX_MyTable_Transaction", 
"key_len":"98", 
"ref":"const", 
"rows":1, 
"Extra":"Using where" 
+2

是什麼在查詢運行'EXPLAIN'的意見呢? –

+0

我編輯了我的問題,並給出了詳細的解釋說 –

+0

我不能馬上看到解釋說,查詢本身應該很慢。也許有更多的mysql優化經驗的人會有一些輸入。 –

回答

0
  1. 確保您在MyTable.transaction_Id有一個索引
  2. 製作確定你有innodb_buffer_pool_size設置一個體面的訴在你的MySQL配置
+0

我對MyTable.transaction_Id有索引,我認爲innodb_buffer_pool_size設置在1GB或500MB左右(我的MySQL服務器有4GB Ram) –

0

我相當肯定你的主鍵不是一個聚集鍵(它可能是空的或不唯一或你改變它在一個點),因爲這將解釋這種行爲,至少如果transaction_Id也不是唯一的(否則你不需要limit 1)。

爲了改善這種特定的查詢,您可以創建以下指標:

create index ix_mytable_transaction_id_tsh_id on MyTable (transaction_id, tsh_id desc); 

使用explain一次。

如果不使用新的鑰匙,迫使它:

SELECT ... FROM `MyTable` force index(ix_mytable_transaction_id_tsh_id) ... 
+0

這是一個Mysql innodb表。 Mysql版本是5.6.27。 tsh_id是一個自動遞增的主鍵。不知道。我已經嘗試過複合索引,但在我的情況下,它幾乎是多餘的,因爲我只搜索transaction_id。 while tsh_id(primary key)is order by clause –

+0

你可以發佈以下結果:'show index from MyTable;','explain extended ','show warnings;'(解釋擴展後),行數結果集'SELECT count(*)FROM MyTable WHERE transaction_Id = _transaction_Id',獲取它的時間以及查詢所需的時間。 – Solarflare

+0

好,讓我檢查 –