之前寫過一篇「熱 MySQL 的方法...」,主要是利用 InnoDB 在 SELECT COUNT(*)
時會掃過一次 primary key 來熱:
pt-find --charset=utf8 --print -h $1 -u USER -p PASSWORD | xargs -t -P8 -I% -n1 sh -c "echo 'SELECT COUNT(*) FROM %;' | mysql -h $1 > /dev/null"
但想要熱整個表格時 (data 部份),這個方法就不夠力了,今天才想到可以這樣做:
SELECT COUNT(*) FROM (SELECT * FROM table_name) t;
這方法會把整個表格資料拉出來,但又不會造成大量的網路 i/o (以及洗畫面)。實際測過後發現效果還不錯... (對於 table scan 使用量很大的表格,靠這個把整個表個塞進 InnoDB buffer)
MySQL 基本上還是主要用 OS Cache, 加少少 page cache
如果大 table Hot cache , 在 linux 直接下 dd if=innodb of=/dev/null 應該更加 hot read cache; 而 select * from 其實還是有 random access 的
InnoDB 早就是自己的 cache 了...
MongoDB 可能比較適合這樣的方式
https://www.percona.com/blog/2008/05/01/quickly-preloading-innodb-tables-in-the-buffer-pool/