iT邦幫忙

0

MySQL 今日點閱數效能問題

chan15 6 年前4118 瀏覽

因為客戶想要抓出 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 效能嗎?

4
simon88
iT邦研究生 3 級 ‧ 6 年前
最佳解答

如果只是看點閱數,不用其他細項資料的話,
是不是每日做排程,把前一天的數量統計出來total,寫在另一張table內,
然後刪除前一天bid明細(或是只保留幾天明細),
這樣子會不會比較好呢?!

chan15 iT邦新手 5 級 ‧ 6 年前 檢舉

感謝您提供這個想法

4
brianc
iT邦研究生 1 級 ‧ 6 年前

避免使用 DATEDIFF

SELECT COUNT(bh_id) FROM blog_hits WHERE blog.bid = blog_hits.bid AND blog_hites.bh_date > CURDATE()

chan15 iT邦新手 5 級 ‧ 6 年前 檢舉

感謝你,我會試試看

4
wiseguy
iT邦超人 1 級 ‧ 6 年前

建立一個索引:
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 應該是秒殺出結果的。

chan15 iT邦新手 5 級 ‧ 6 年前 檢舉

雖然 bh_date 宣告為 datetime
在用比較功能時要不要用 cast 轉一下型態?
因為印象中有時候使用的時候不 convert 或 cast 一下會出問題

4
ttddmon
iT邦新手 5 級 ‧ 6 年前

多開一個欄位 只有date 建這欄位當所引 這樣最快

(SELECT COUNT(bh_id) FROM blog_hits WHERE blog.bid = blog_hits.bid AND DATEDIFF(blog_hites.bh_date, CURDATE()) = 0)

為什麼要關聯呢? 這句我看不到blog要做啥用的 沒用就拿掉關聯吧 會快N倍哈哈

lukeshei iT邦新手 3 級 ‧ 6 年前 檢舉

用mysql 做這件事,本身就是一個錯誤,一個簡單的檔案就能解決

我要發表回答

立即登入回答