4

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

我的sql如下:

SELECT
    COUNT(id)
FROM
    subscribers
WHERE
    suid=541839243781

需要12.6020 秒才能加载

但是以下相同的查询(获取用户的订阅)只需要0.0036 秒即可加载(似乎还可以)

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

显示创建表:

    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   

我怎样才能索引它或优化它以尽可能快地加载?因为 12 秒对于这个来说实在是太多了……

4

2 回答 2

6

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

于 2012-04-19T17:39:37.883 回答
0

既然id不能NULL,可以改写为:

SELECT
    COUNT(*)
FROM
    subscribers
WHERE
    suid=541839243781

除了最近(或未来)的优化器,它应该比COUNT(id).


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

于 2012-04-19T18:33:52.160 回答