【发布时间】:2016-08-13 03:47:16
【问题描述】:
我正在使用带有 innodb 的 mysql 在 Rails 中开发一个应用程序。我需要经常获取全表计数,并且我知道使用 innodb,计算表中的所有记录可能会非常昂贵,因为它需要全表扫描。我正在查看 rails 控制台中的一个典型表,并查看查询时间以计算记录。到目前为止,我发现第一次计算记录需要很长时间,但在随后的尝试中速度要快得多。例如:
2.2.2 :002 > Request.count
(683.7ms) SELECT COUNT(*) FROM `requests`
=> 260588
2.2.2 :003 > Request.count
(47.6ms) SELECT COUNT(*) FROM `requests`
=> 260588
2.2.2 :004 > Request.count
(46.7ms) SELECT COUNT(*) FROM `requests`
=> 260588
那么,首先,我什至需要担心优化这个结果吗?也许计数正在被 Rails 或 mySql 或 InnoDB 缓存,没有什么可担心的。
我将假设在多个用户在任何给定时间写入表的生产环境中仍然存在一些问题。在这种情况下,我如何“重置”缓存或任何让我对计数时间产生不切实际的乐观看法的东西,以便我可以做一些诚实的基准测试?我试过写记录,或者只是用reload!重新加载控制台,但我从来没有得到最初的长时间。我敢打赌,如果我退出控制台并重新启动 mysql 就可以了,但我宁愿不必那么努力。
最后,我听说像下面这样的查询会运行得更快:
select count(*) from requests use index(<index_name>);
似乎最自然的索引是id 字段。
select count(*) from service_requests use index(id)
但这给了我以下错误:
ERROR 1176 (42000): Key 'id' doesn't exist in table 'requests'
但 id 不仅仅是一个键,它还是主键。在某些表上,它是唯一的索引。为什么 id 不被视为键?
【问题讨论】:
标签: mysql ruby-on-rails innodb