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

MySQL查询问题-计数查询使用大量CPU,mysql,count,cpu,Mysql,Count,Cpu,我们在mysql上有一个表来记录我们网站的所有访问者。结构如下所示 创建表“tblvisitors”( `visitorURL `长文本, `visitorDatetime`datetime默认值为空, `visitorIP`varchar(255)默认为空, `visitorID`int(10)非空自动增量, `visitorUser`varchar(255)默认为空, `visitorShow`varchar(50)默认为空, `visitorIPcaption`varchar(255)默认

我们在mysql上有一个表来记录我们网站的所有访问者。结构如下所示

创建表“tblvisitors”( `visitorURL `长文本, `visitorDatetime`datetime默认值为空, `visitorIP`varchar(255)默认为空, `visitorID`int(10)非空自动增量, `visitorUser`varchar(255)默认为空, `visitorShow`varchar(50)默认为空, `visitorIPcaption`varchar(255)默认为空, `visitorIPRange`varchar(255)默认为空, 主键(`visitorID`), 键'INDEXDT'('visitorDatetime'), 键'INDEXIP'('visitorIP`) )ENGINE=MyISAM默认字符集=1; 该表目前有500多万条记录

我们每半秒进行一次插入操作,每半秒进行一次选择操作,其中涉及visitorURL列上的条件和SELECT of COUNT字段

查询是:

从TBL访问者中选择计数(访问者URL) 访问者在哪里http://mihirdarji.com/something' 在一个具有8GB 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 | |id |选择|类型|类型|可能的|键|键|列|参考|行|额外| |1 |简单| TBLVisitor | ALL | NULL | NULL | NULL | NULL | 4293277 |使用where|
这个表中定义了索引吗?如果没有,您肯定应该在
visitorURL
列上。您当前的查询需要完整的表扫描,这需要很多时间。但是,如果使用简单索引,为长文本字符串编制索引可能会给您带来所需的速度提升(因为唯一字符串的数量与表中的记录计数相似)。因此,在这种情况下,全文索引可能是更好的选择。这将要求您使用特殊设置。

visitorIp真的需要是varchar(255)吗

  • 首先在visitorURL上创建索引
  • 第二,仅统计静态内容
    从访问者URL=…

  • 对此运行explain(解释)

    似乎启用选项对我起到了作用。

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

    -visitorURL是longtext我不确定索引是否有效-将尝试一些静态内容您可以在longtext上添加索引:“对于BLOB和文本列上的索引,您必须指定索引前缀长度”c.f。就像其他示例一样,需要在visitorURL上创建索引,“可能的_键”为“null”:如果此列为null,则没有相关索引。在这种情况下,您可以通过检查WHERE子句来检查它是否引用了一些适合索引的列,从而提高查询的性能。如果是这样,请创建一个适当的索引,并使用EXPLAIN AgainHnx检查查询,但全文索引是否有助于此类查询全文索引不允许我匹配准确的URL,我可以以某种方式匹配吗?因此问题是,您在该
    visitorURL
    字段中存储了什么?它是HTTP referer还是您的网站之一?我只是在想,那一列中可能有多少个不同的值,大约有20万个不同的值。在你的情况下,一个简单的索引听起来是合理的!啊,我现在明白了。您匹配了其他列的长度。 SELECT COUNT(visitorURL) FROM tblVisitors WHERE visitorURL='http://mihirdarji.com/something' | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | | 1 | SIMPLE | tblVIsitors | ALL | NULL | NULL | NULL | NULL | 4293277 | Using where |