假设,为了便于说明,您使用包含三列的简单MySQL"books"表运行库:
(身份,职称,身份)
报告每个州有多少本书的简单查询是:
SELECT status, COUNT(*) FROM books GROUP BY status
Run Code Online (Sandbox Code Playgroud)
或者专门找到有多少本书:
SELECT COUNT(*) FROM books WHERE status = "AVAILABLE"
Run Code Online (Sandbox Code Playgroud)
但是,一旦表增长到数百万行,这些查询需要几秒钟才能完成.在"状态"列中添加索引似乎不会对我的体验产生影响.
除了定期缓存结果或在每次书籍更改状态(通过触发器或其他机制)时在单独的表中显式更新摘要信息,是否有任何加速这些类型查询的技术?似乎COUNT查询最终查看每一行,并且(不知道更多细节)我有点惊讶,这些信息无法以某种方式从索引中确定.
UPDATE
使用具有200万行的样本表(带有索引"状态"列),我对GROUP BY查询进行了基准测试.使用InnoDB存储引擎,查询在我的机器上需要3.0 - 3.2秒.使用MyISAM,查询需要0.9 - 1.1秒.在任何一种情况下,计数(*),计数(状态)或计数(1)之间没有显着差异.
MyISAM无疑要快一点,但我很想知道是否有办法让等效查询运行得更快(例如10-50毫秒 - 足够快,可以在低流量站点的每个网页请求上调用)没有缓存和触发器的精神开销.听起来答案是"没有办法快速运行直接查询"这是我的预期 - 我只是想确保我没有错过一个简单的替代方案.