为了便于说明,假设您正在使用一个简单的MySQL"books"表运行一个库,该表有三列:
(身份、头衔、身份)
- id是主键
- 这本书的书名是title
- status可以是描述书籍当前状态的枚举(例如可用、签出、处理、丢失)
一个简单的查询可以报告每个州有多少本书:
SELECT status, COUNT(*) FROM books GROUP BY status
或者具体查找有多少本书:
SELECT COUNT(*) FROM books WHERE status = "AVAILABLE"
然而,一旦表增长到数百万行,这些查询需要几秒钟才能完成.在"状态"栏中添加索引似乎对我的体验没有影响.
除了定期缓存结果或每次书籍更改状态(通过触发器或其他机制)时在单独的表中显式更新摘要信息外,还有什么技术可以加速此类查询?似乎计数查询最终会查看每一行,而且(在不知道更多细节的情况下)我有点惊讶,这些信息无法以某种方式从索引中确定.
UPDATE
使用包含200万行的样本表(带有索引的"status"列),我通过查询对GROUP进行了基准测试.使用InnoDB存储引擎,在我的机器上进行查询需要3.0-3.2秒.使用MyISAM,查询需要0.9-1.1秒.在这两种情况下,计数(*)、计数(状态)或计数(1)之间没有显著差异.
MyISAM确实快了一点,但我很好奇,是否有一种方法可以让一个等价的查询运行快much秒(例如,10-50毫秒——足够快,可以在低流量站点的每个网页请求中调用),而不需要缓存和触发器的精神开销.听起来答案是"没有办法快速运行直接查询",这正是我所期望的——我只是想确保我没有错过一个简单的 Select .