我有一個使用InnoDB的表,它存儲了我的系統發送的所有消息。目前這張桌子有四千萬行,每月增長三百四十萬。與大表的Mysql:如何優化此查詢?
我的查詢基本上是選擇從用戶發送並在數據範圍內的消息。這裏是一個簡單的創建表格:
CREATE TABLE `log` ( `id` int(10) NOT NULL DEFAULT '0', `type` varchar(10) NOT NULL DEFAULT '', `timeLogged` int(11) NOT NULL DEFAULT '0', `orig` varchar(128) NOT NULL DEFAULT '', `rcpt` varchar(128) NOT NULL DEFAULT '', `user` int(10) DEFAULT NULL, PRIMARY KEY (`id`), KEY `timeLogged` (`timeLogged`), KEY `user` (`user`), KEY `user_timeLogged` (`user`,`timeLogged`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
注意:我也有單獨的索引,因爲其他查詢。
查詢看起來是這樣的:
SELECT COUNT(*) FROM log WHERE timeLogged BETWEEN 1282878000 AND 1382878000 AND user = 20
的問題是,這個查詢從2分鐘需要10分鐘,這取決於它是太多的時間等待頁面加載的用戶和服務器的負載。我在應用程序中啓用了mysql緩存並緩存,但問題是,當用戶搜索新的範圍時,它不會命中緩存。
我的問題是:
- 會改變user_timeLogged指數有什麼區別?
- 這是MySQL和大型數據庫的問題嗎?我的意思是,Oracle或其他數據庫是否也遭受這個問題?
AFAIK,我的索引已正確創建,並且此查詢不應該花這麼長時間。
感謝任何幫助的人!
後從以下`EXPLAIN SELECT COUNT(*)FROM日誌WHERE timeLogged之間的輸出1282878000 AND 1382878000 AND user = 20;` – 2010-12-01 21:29:57
我會將它作爲註釋發佈,但它並未解決查詢優化問題,但是您是否考慮過歸檔策略而不是將所有消息保留在單個表中?以750k /月的速度記錄4000萬條記錄意味着超過四年的數據。除非確實是在任意時代的消息以相同的頻率查詢,否則您可能需要考慮將舊消息移動到單獨的表中,並實施將舊消息的請求引導到該表的邏輯。 – 2010-12-01 21:43:05