2013-11-28 29 views
2

我有一個MySQL的現有查詢需要25分鐘才能在帶有SSD驅動器的新v5.6.14服務器上運行。MySQL批量鍵訪問 - 沒有好處?

它的簡單形式:

SELECT a.*, b.* 
FROM table a 
INNER JOIN table b 
ON a.uid = b.uid; 

有每個臺31萬行,並有UID之間的一個一對一的關係上的每個。另外,uid是兩個表的主鍵。這些表分別爲2k和4k,沒有比varchar(255)更寬的列。

我來自SQL Server後臺,並希望此查詢通過合併連接以秒爲單位運行。雖然我明白MySQL限於嵌套循環,但我想我會嘗試新的(5.6)批量鍵訪問優化,它與多範圍讀取增強功能一起使事情變得更快。但是,這隻能帶來很小的改善 - 降至24分鐘。

說明顯示沒有使用臨時表或文件夾,當啓用BKA時,可以看到:
|使用連接緩衝區(分批鍵訪問)|

相關optimser設置:

optimizer_switch=mrr=on 
optimizer_switch=mrr_cost_based=off 
optimizer_switch=batched_key_access=on 
join_buffer_size=<increased 100x from default> 
read_rnd_buffer_size=<increased 100x from default> 

有什麼我錯過了什麼?或者僅僅是因爲固態硬盤足夠快而且BKA只對連續讀取小節盤有好處?

+0

刪除a。*和b。*。而是使用字段名稱。 *將在查詢執行時選擇其他信息。 – Damodaran

+0

謝謝@Damodaran。是的,實際上我只選擇了我需要的字段 - 但有幾十個字段 - 爲了簡潔起見,我用* s表示。 – user3044586

回答

0

有了這樣的事情,通過首先從其中一個表格中進行選擇來獲得下限估計值可能很有用。

根據使用的語言,可能會有一些選項來打開或關閉緩衝。 percona建議關閉緩衝並解釋如何在使用php時做到這一點。 mysql select語法還允許您對緩存進行一些控制。既然你得到了整個桌子,你可能沒有用,所以把它關掉。

如果您使用的庫具有使用準備好的語句的能力,那麼也可能有所幫助。

如果您需要從數據庫中卸載處理時間,則可以使用mysqldump轉儲這兩個表並在您自己的腳本中處理脫機加入。

儘管有1:1映射,但是如果沒有,那麼爲什麼不使用一個表呢,可能有一個很好的理由,即你有兩個表中的數據。