mysql COUNT()num行太慢了

时间:2012-04-19 17:35:10

标签: mysql indexing

我正在尝试从 22米行的表格中获取用户的订阅者数量。

我的sql如下:

SELECT
    COUNT(id)
FROM
    subscribers
WHERE
    suid=541839243781

需要 12.6020 s 来加载

然而,以下相同的查询(获取用户订阅)只需要 0.0036 s 来加载(似乎没问题)

SELECT
    COUNT(uid)
FROM
    subscribers
WHERE
    uid=541839243781

我的说明:

    id  select_type     table            type   possible_keys    key    key_len     ref     rows                 Extra
     1     SIMPLE    dvx_subscribers    index        4            4       16        NULL    22041275    Using where; Using index

SHOW CREATE TABLE:

    CREATE TABLE `subscribers` (
 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 `sid` bigint(20) unsigned NOT NULL,
 `uid` bigint(20) unsigned NOT NULL,
 `suid` bigint(20) unsigned NOT NULL,
 `date` datetime NOT NULL,
 KEY `id` (`id`),
 KEY `2` (`uid`,`suid`),
 KEY `4` (`suid`,`id`)
) ENGINE=MyISAM AUTO_INCREMENT=23226599 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

的索引:

Table   Non_unique  Key_name    Seq_in_index    Column_name     Collation   Cardinality     Sub_part    Packed  Null    Index_type  Comment
subscribers     1   id  1   id  A   NULL    NULL    NULL        BTREE   
subscribers     1   2   1   uid     A   449821  NULL    NULL        BTREE   
subscribers     1   2   2   suid    A   459193  NULL    NULL        BTREE   
subscribers     1   4   1   suid    A   6115    NULL    NULL        BTREE   
subscribers     1   4   2   id  A   22041275    NULL    NULL        BTREE   

我如何索引或优化它以尽可能快地加载?因为12secs对于这个太多了......

2 个答案:

答案 0 :(得分:6)

第二个查询针对索引(uid)运行,因此它几乎立即完成。但是,第一个需要扫描表,因为没有合适的索引可供使用。在(suid, id)上创建索引以解决此问题。

答案 1 :(得分:0)

由于id不能为NULL,您可以重写为:

SELECT
    COUNT(*)
FROM
    subscribers
WHERE
    suid=541839243781

除了最近(或将来)的优化器,它应该比COUNT(id)快一点。


整整4秒,听起来太慢了,即使对于MyISAM来说也是如此。也许索引是碎片化的。