我有一個約30萬行(並且不斷增長!)的表格,目前我有一些簡單的範圍選擇問題。MySQL:哪些索引用於簡單範圍選擇?
查詢,看起來像這樣的:
SELECT SUM(CEIL(dlvSize/100)) as numItems
FROM log
WHERE timeLogged BETWEEN 1000000 AND 2000000
AND user = 'example'</pre>
它需要時間才能完成,我認爲,解決辦法是在我使用的索引。下面是結果解釋:
+----+-------------+-------+-------+---------------------------------+---------+---------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------------------------+---------+---------+------+----------+-------------+
| 1 | SIMPLE | log | range | PRIMARY,timeLogged | PRIMARY | 4 | NULL | 11839754 | Using where |
+----+-------------+-------+-------+---------------------------------+---------+---------+------+----------+-------------+
我的表結構是這樣的一個(減少以使其更適合對這個問題):
CREATE TABLE IF NOT EXISTS `log` (
`origDomain` varchar(64) NOT NULL default '0',
`timeLogged` int(11) NOT NULL default '0',
`orig` varchar(128) NOT NULL default '',
`rcpt` varchar(128) NOT NULL default '',
`dlvSize` varchar(255) default NULL,
`user` varchar(255) default NULL,
PRIMARY KEY (`timeLogged`,`orig`,`rcpt`),
KEY `timeLogged` (`timeLogged`),
KEY `orig` (`orig`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
的我能做些什麼來優化這個查詢任何想法或索引在我的桌子上?
這樣,您也可以將索引放在'timeLogged'上,因爲它已經參與了主鍵的左側。 – bobince 2010-09-14 14:59:59
謝謝,這將查詢時間縮短到不到1分鐘。我會繼續搜索其他選項,因爲我希望至少在10秒內完成此操作。 – Fernando 2010-09-14 20:22:20
爲什麼不是'timeLogged_user(timeLogged,user)'的關鍵。我認爲索引工作從左到右? – 2014-04-03 02:20:41