MySQL查询问题 - 计数查询使用大量CPU

时间:2010-02-03 07:27:16

标签: mysql count cpu

我们有一个关于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 |

6 个答案:

答案 0 :(得分:1)

  1. 首先在visitorURL上创建一个索引
  2. 仅限COUNT个静态SELECT COUNT(1) FROM tblVisitors WHERE visitorURL=...

答案 1 :(得分:1)

似乎启用选项option_mysqld_low-priority-updates为我做了诀窍。

答案 2 :(得分:1)

而不是索引URL列,您可以将URL的哈希值存储在单独的varchar列中并索引并查询该列。但无论你做什么,你都需要一个你正在计算的列的索引。另请查看MyIsam密钥缓存设置,以确保尽可能有效地处理索引。

答案 3 :(得分:0)

您是否在此表中定义了任何索引?如果没有,您绝对应该visitorURLmake an index。您当前的查询需要全表扫描,这需要花费大量时间。但是,如果使用简单索引(因为唯一字符串的数量类似于表中的记录计数),索引长文本字符串可能会提高您所需的速度。因此,在这种情况下,全文索引可能是更好的选择。这将要求您使用特殊"full-text search functions"

答案 4 :(得分:0)

visitorIp真的需要是varchar(255)吗?

答案 5 :(得分:0)

对此query

运行解释