2010年11月15日 星期一

MyISAM 的 data cache 和 covering index

最近下 SQL 都有加 sql_no_cache, 今天測一個會取出 5,000 ~ 10,000 筆資料的 SQL, 觀察到一個有趣的事:
  • 第一次執行時, Sending data 花了 2.457162s, 其它狀態沒花到什麼時間。
  • 第二次執行時, Sending data 卻只花了 0.154124s
才想到說, 這該不會就是 OS 的檔案 cache 吧? 不知道 cache 了什麼, 大幅減低讀硬碟的時間。真相如何, 只有待回頭惡補 OS 相關知識, 或深入研究 Linux 底層運作方式時才會明白吧。
但只不過個幾千筆資料, 沒道理要花到 0.15 秒, 於是將 WHERE 條件內的欄位和 SELECT 後要取出的欄位都加進 index, 也就是用 covering index, 結果 Sending data 只花了  0.011197s。

解決一個瓶頸後, 立即觀察到下一個瓶頸, 剛好也能用 covering index 解決。建好 covering index, 再用 load index 預先載入 index 到記憶體裡, 簡單的組合技可以提昇不少速度。相較於 MEMORY ENGINE (+heap index), 這個作法支援 range query, 又不用擔心 MySQL server 重開後要重建資料, 用起來滿方便的。

備註: 用 explain 看 SQL, 在 extra 的地方有出現「using index」就表示成功地用了 covering index。

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...