gpt4 book ai didi

mysql - 统计mysql innodb表中的记录数

转载 作者:行者123 更新时间:2023-11-29 11:21:20 24 4
gpt4 key购买 nike

我正在 Rails 中使用 mysql 和 innodb 开发一个应用程序。我需要经常获取全表计数,并且我知道使用 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 不被视为 key ?

最佳答案

要优化它,请运行 optimize table然后您可以创建另一个不是主键的索引,因为 InnoDB 使用聚集主键。

创建另一个索引时,您必须在另一个易于扫描的字段上创建它,而不是像文本字段那样的字段(如果它适用于请求)。

错误 - 如果您继续使用主键而不是出于任何原因创建另一个索引:

正如您提到的,主键确实是 id然后使用use index(id)id (查询来自的表中的 PK)将不起作用,它将是 USE INDEX (PRIMARY) 。要查看表的其他索引,请运行 SHOW INDEX FROM <Table>命令,这将显示表的其他索引名称。

更多信息: http://dev.mysql.com/doc/refman/5.7/en/optimize-table.html http://dev.mysql.com/doc/refman/5.7/en/index-hints.html

关于mysql - 统计mysql innodb表中的记录数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38860879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com