假设仅供演示目的,您正在使用一个简单的MySQL“books”表运行库,该表具有三列:
(id,title,status)
- id是主键
- title是书籍标题
- status可以是枚举,描述书籍的当前状态(例如:AVAILABLE,CHECKEDOUT,PROCESSING,MISSING)
报告每种状态下有多少本书的简单查询如下:
SELECT status, COUNT(*) FROM books GROUP BY status
或者特别查找有多少本书可用:
SELECT COUNT(*) FROM books WHERE status = "AVAILABLE"
然而,一旦表格增长到数百万行,这些查询需要几秒钟才能完成。在我的经验中,在“状态”列上添加索引似乎没有什么作用。除了定期缓存结果或每次书籍更改状态时显式更新摘要信息(通过触发器或其他机制),是否有任何技术可以加速这些查询?似乎COUNT查询最终会查看每一行,并且(不知道更多细节)我有点惊讶于这些信息不能从索引中某种方式确定。更新:使用具有索引的示例表(“状态”列),含有200万行数据的情况下,我对GROUP BY查询进行了基准测试。使用InnoDB存储引擎,该查询在我的机器上花费3.0-3.2秒。使用MyISAM,该查询需要0.9-1.1秒。在任一情况下,count(*)、count(status)或count(1)没有明显差异。MyISAM确实稍微快一点,但我很好奇是否有一种方法可以使等效的查询运行得更快(例如10-50毫秒——足够快,可以在低流量站点的每个网页请求上调用),而不需要缓存和触发器的心理负担。听起来答案是“没有办法快速运行直接查询”,这就是我预期的答案——我只想确保我没有错过任何简单的替代方案。