0

我正在尝试获取用户的所有订阅者

我的查询:

SELECT
    COUNT(sub.id) as ids
FROM
    subscribers as sub
WHERE
    suid=541839243781

解释打印:

╔════╦═════════════╦═══════╦══════╦═══════════════ ╦═════╦═════════╦═══════╦═══════╦══════════════════════
║ id ║ select_type ║ table ║ type ║ possible_keys ║ key ║ key_len ║ ref ║ rows ║ Extra ║
╠════╬═════════════╬═══════╬══════╬═══════════════ ╬═════╬═════════╬═══════╬═══════╬══════════════════
║ 1 ║ SIMPLE ║ sub ║ ref ║ i3 ║ i3 ║ 8 ║ const ║ 47890 ║ 使用索引 ║
╚════╩═════════════╩═══════╩══════╩═══════════════ ╩═════╩═════════╩═══════╩═══════╩══════════════════

所以目前我得到的总数大约是48k并且需要0.0333加载......如果这上升到1m5m?然后可能需要很长时间才能加载...

我在订阅者表上的索引是:

╔═════════════╦════════════╦═══════════════════╦══ ════════════╦═════════════╦═══════════╦═══════════ ══╦══════════╦════════╦══════╦════════════╦═══════ ══╗
║ Table ║ Non_unique ║ Key_name ║ Seq_in_index ║ Column_name ║ Collat​​ion ║ Cardinality ║ Sub_part ║ Packed ║ Null ║ Index_type ║ Comment ║
╠═════════════╬════════════╬═══════════════════╬══ ════════════╬═════════════╬═══════════╬═══════════ ══╬══════════╬════════╬══════╬════════════╬═══════ ══╣
║ 订阅者 ║ 0 ║ PRIMARY ║ 1 ║ id ║ A ║ 60251 ║ NULL ║ NULL ║ ║ BTREE ║ ║
║ 订阅者 ║ 1 ║ total_subscribers ║ 1 ║ id ║ A ║ 60251 ║ NULL ║ NULL ║ ║ BTREE ║ ║
║ 订阅者 ║ 1 ║ total_subscribers ║ 2 ║ suid ║ A ║ 60251 ║ NULL ║ NULL ║ ║ BTREE ║ ║
║ 订阅者 ║ 1 ║ i3 ║ 1 ║ suid ║ A ║ 6025 ║ NULL ║ NULL ║ ║ BTREE ║ ║
║ 订阅者 ║ 1 ║ i3 ║ 2 ║ uid ║ A ║ 60251 ║ NULL ║ NULL ║ ║ BTREE ║ ║
║ 订阅者 ║ 1 ║ i3 ║ 3 ║ id ║ A ║ 60251 ║ NULL ║ NULL ║ ║ BTREE ║ ║
╚═════════════╩════════════╩═══════════════════╩══ ════════════╩═════════════╩═══════════╩═══════════ ══╩══════════╩════════╩══════╩════════════╩═══════ ══╝

那么我怎样才能使这个查询更有效率呢?

4

3 回答 3

1

该列是否id允许 NULL 值?如果没有,则更改为SELECT COUNT(*),引擎将能够仅从索引回答查询,而无需参考表数据。这应该会加快速度,并且根据 MySQL 存储和检索基数统计信息的方式,可以使查询即时进行。

于 2012-04-17T17:42:37.373 回答
1

你可能做不到。

也就是说,我希望 COUNT 操作必然与行数成线性关系。您可能会发现使用 100 万行需要 0.12 秒而不是 0.0333 秒。

如果它真的成为问题,您也许可以使用预计算和缓存来解决这个问题。例如,您可能有一个每小时计算计数并将它们存储在表中的工作。您的计数可能会过期一个小时,但检索它们会快得多。

于 2012-04-17T17:13:04.530 回答
0

您可以将 sys.tables 加入到 sys.partitions。表的行统计信息存储在那里。

错误:这适用于 MS SQL Server,抱歉应该提到这一点。

于 2012-04-17T17:26:21.390 回答