因為客戶想要抓出 blog 今天的點閱數
所以當初另外開了一個 blog_hits 紀錄
資料庫結構如下
bh_id int unsigned pk
bh_date datetime
bh_ip varchar(20)
bid int unsigned (blog 連結用的 fk)
撈出今日點閱的語法如下
(SELECT COUNT(bh_id) FROM blog_hits WHERE blog.bid = blog_hits.bid AND DATEDIFF(blog_hites.bh_date, CURDATE()) = 0)
目前 total 資料筆數已達 4000 多萬,所以撈取這項內容的時後會有點卡卡的
該做索引的都有做索引
請問有辦法改善 query 效能嗎?
如果只是看點閱數,不用其他細項資料的話,
是不是每日做排程,把前一天的數量統計出來total,寫在另一張table內,
然後刪除前一天bid明細(或是只保留幾天明細),
這樣子會不會比較好呢?!
避免使用 DATEDIFF
SELECT COUNT(bh_id) FROM blog_hits WHERE blog.bid = blog_hits.bid AND blog_hites.bh_date > CURDATE()
建立一個索引:
alter table blog_hits add index bd(bid,bh_date);
然後把SQL改為:
SELECT COUNT(*) FROM blog_hits WHERE blog.bid = bid AND bh_date >= CURDATE();
只要你的 key_buffer 開得夠大,大過 blog_hits.myi 這個檔,則此 SQL 應該是秒殺出結果的。
多開一個欄位 只有date 建這欄位當所引 這樣最快
(SELECT COUNT(bh_id) FROM blog_hits WHERE blog.bid = blog_hits.bid AND DATEDIFF(blog_hites.bh_date, CURDATE()) = 0)
為什麼要關聯呢? 這句我看不到blog要做啥用的 沒用就拿掉關聯吧 會快N倍