【发布时间】:2015-02-21 22:14:53
【问题描述】:
我有一个加载一些高级统计信息的页面。没什么特别的,只有大约 5 个指标。有两个特定的查询需要大约 5 秒才能加载:
+ SELECT COUNT(*) FROM mybooks WHERE book_id IS NOT NULL
+ SELECT COUNT(*) FROM mybooks WHERE is_media = 1
该表有大约 500,000 行。两列都有索引。
这些信息一直在变化,所以我认为这里的缓存不会起作用。使用哪些技术可以加快速度?我在想:
- 创建一个非规范化的
stats表,在更新列时更新该表。 - 通过 ajax 加载慢速查询(这不会加快速度,但可以让页面立即加载)。
这里有什么建议?要求是页面在 1s 内加载完毕。
表结构:
- id(pk,自动递增)
- book_id (bigint)
- is_media(布尔值)
【问题讨论】:
-
我个人会走AJAX路线..易于实现,解决问题,不需要新表并避免
mybooks和stats之间可能出现的数据不一致。 -
能否包含您的表结构?
-
@Pattle 请查看更新后的问题。
-
500,000 行并不多。扫描它们不应花费 5 秒钟。如果频繁更新这张表,可能意味着计数查询被简单阻塞,等待了很长时间。我可能会创建一个统计表并随着数据的变化对其进行更新。或者,如果您可以允许统计信息有点过时,请每 10 分钟左右在后台运行这些计数查询以更新统计信息表。从某种意义上说,缓存结果。
-
即使你得到了完美的 INDEX,它也将有 500K 行长,并且必须扫描该索引。也许不是 5 秒,但仍然“太长”。