我们有一个关于mysql的表来记录我们网站的所有访问者。该结构如下所示MySQL查询问题 - 计数查询使用大量的CPU
CREATE TABLE `tblvisitors` ( `visitorURL` longtext, `visitorDatetime` datetime DEFAULT NULL, `visitorIP` varchar(255) DEFAULT NULL, `visitorID` int(10) NOT NULL AUTO_INCREMENT, `visitorUser` varchar(255) DEFAULT NULL, `visitorShow` varchar(50) DEFAULT NULL, `visitorIPcaption` varchar(255) DEFAULT NULL, `visitorIPRange` varchar(255) DEFAULT NULL, PRIMARY KEY (`visitorID`), KEY `INDEXDT` (`visitorDatetime`), KEY `INDEXIP` (`visitorIP`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
表有现在超过500万分的记录。
我们每半秒执行一次INSERT操作,每半秒执行一次SELECT操作,其中涉及visitorURL列上的CRITERIA和COUNT字段的Select。
查询是:
SELECT COUNT(visitorURL) FROM tblVisitors WHERE visitorURL='http://mihirdarji.com/something'
这将拍摄的CPU使用率90%与8 GB内存的8核心服务器。
MySQL管理器显示很多连接上面的查询等待执行。
任何建议将受到欢迎。
解释计划说
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | | 1 | SIMPLE | tblVIsitors | ALL | NULL | NULL | NULL | NULL | 4293277 | Using where |
-visitorURL是longtext我不确定索引是否可以工作 - 将尝试使用静态东西 – Mihir 2010-02-03 07:59:51
您可以肯定地在长文本上添加索引:“对于BLOB和TEXT列上的索引,必须指定一个索引前缀长度”c.f.http://dev.mysql.com/doc/refman/5.0/en/blob.html – 2010-02-03 20:13:18