我们有一个关于mysql的表来记录我们网站的所有访问者。结构如下所示
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 COUNT(visitorURL) FROM tblVisitors WHERE visitorURL='http://mihirdarji.com/something'
这在具有8 GB Ram的8核服务器中将CPU使用率提高到90%。
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 |
答案 0 :(得分:1)
SELECT COUNT(1) FROM tblVisitors WHERE visitorURL=...
答案 1 :(得分:1)
似乎启用选项option_mysqld_low-priority-updates为我做了诀窍。
答案 2 :(得分:1)
而不是索引URL列,您可以将URL的哈希值存储在单独的varchar列中并索引并查询该列。但无论你做什么,你都需要一个你正在计算的列的索引。另请查看MyIsam密钥缓存设置,以确保尽可能有效地处理索引。
答案 3 :(得分:0)
您是否在此表中定义了任何索引?如果没有,您绝对应该visitorURL
列make an index。您当前的查询需要全表扫描,这需要花费大量时间。但是,如果使用简单索引(因为唯一字符串的数量类似于表中的记录计数),索引长文本字符串可能会提高您所需的速度。因此,在这种情况下,全文索引可能是更好的选择。这将要求您使用特殊"full-text search functions"。
答案 4 :(得分:0)
visitorIp真的需要是varchar(255)吗?
答案 5 :(得分:0)
对此query
运行解释