我正在尝试从 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对于这个太多了......
答案 0 :(得分:6)
第二个查询针对索引(uid)
运行,因此它几乎立即完成。但是,第一个需要扫描表,因为没有合适的索引可供使用。在(suid, id)
上创建索引以解决此问题。
答案 1 :(得分:0)
由于id
不能为NULL
,您可以重写为:
SELECT
COUNT(*)
FROM
subscribers
WHERE
suid=541839243781
除了最近(或将来)的优化器,它应该比COUNT(id)
快一点。
整整4秒,听起来太慢了,即使对于MyISAM来说也是如此。也许索引是碎片化的。