sql - 数据库中有多少行太多了?
我有一个拥有1,000,000条记录的MySQL InnoDB表。 这太多了吗? 或者数据库可以处理这个以及更多? 我问,因为我注意到一些查询(例如,从表中获取最后一行)在表中的行(1秒)比在100行中慢(秒)。
10个解决方案
106 votes
我有一个带有1000000个寄存器的MySQL InnoDB表。 这太多了吗?
不,1,000,000行(AKA记录)对于数据库来说并不算太多。
我问,因为我注意到一些查询(例如,获取表的最后一个寄存器)在表中有100万个寄存器比在100个寄存器中慢。
该声明中有很多要考虑的因素。 通常的嫌疑人是:
写得不好的查询
不使用主键,假设表中存在一个主键
设计不良的数据模型(表格结构)
缺乏索引
OMG Ponies answered 2019-06-12T18:16:54Z
55 votes
我有一个超过97,000,000条记录的数据库(30GB数据文件),没有问题。
只需记住定义和改进表索引。
显而易见,1,000,000不是很多! (但如果你没有索引;是的,这很多)
amir beygi answered 2019-06-12T18:17:31Z
17 votes
使用'explain'检查查询并查看查询计划是否有任何问题。
Journeyman Programmer answered 2019-06-12T18:17:55Z
9 votes
我认为这是一个常见的误解 - 在数据库可扩展性方面,大小只是等式的一部分。 还有其他问题很难(或更难):
工作集有多大(即需要在内存中加载多少数据并积极处理)。 如果您只是插入数据然后对其执行任何操作,那么它实际上是一个很容易解决的问题。
需要什么级别的并发性? 是否只有一个用户插入/读取,或者我们有多个客户端同时运行?
需要什么级别的承诺/耐久性和性能的一致性? 我们是否必须确保我们能够兑现每次提交。 如果平均交易速度很快,或者我们是否希望确保所有交易都能可靠地快速完成(六西格玛质量控制,如 - [http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization]-and-六西格玛/)。]
您是否需要执行任何操作问题,例如更改表模式? 在InnoDB中,这是可能的,但速度极慢,因为它经常需要在前台创建一个临时表(阻止所有连接)。
所以我要说明两个限制问题:
您自己编写查询/具有良好索引的技能。
您可以忍受等待ALTER TABLE语句的痛苦程度。
Morgan Tocker answered 2019-06-12T18:19:08Z
3 votes
如果您的意思是100万行,那么这取决于索引的完成方式和硬件配置。 对于企业数据库,甚至是体面设备上的开发数据库,一百万行不是很大的数量。
如果你的意思是100万列(不确定甚至可能在MySQL中),那么是的,这看起来有点大,可能会引起问题。
GrayWizardx answered 2019-06-12T18:19:39Z
3 votes
寄存器? 你是说记录吗?
如今,一百万条记录对于数据库来说并不是什么大不了的事。 如果您遇到任何问题,可能不是数据库系统本身,而是您正在运行它的硬件。 你很可能在硬件耗尽之前不会遇到数据库问题。
现在,显然有些查询比其他查询慢,但是如果两个非常相似的查询在不同的时间运行,则需要弄清楚数据库的执行计划是什么并对其进行优化,即使用正确的索引,正确的规范化等。
顺便说一句,表中没有“最后”记录这样的东西,从逻辑的角度看它们没有固有的顺序。
phoebus answered 2019-06-12T18:20:23Z
3 votes
我已经看到了具有数十亿(索引)记录的非分区表,这些表自行加入分析工作。 我们最终划分了这个东西,但老实说,我们没有看到那么大的差异。
也就是说,那是在Oracle中,我没有在MySQL中测试过那么多的数据。 索引是你的朋友:)
Jé Queue answered 2019-06-12T18:20:54Z
2 votes
假设你用“寄存器”表示“记录”没有,它不是太多,MySQL可以很好地扩展,并且可以保存与你硬盘中的空间一样多的记录。
显然,虽然搜索查询会更慢。 除了确保字段被正确编入索引外,实际上没有办法解决这个问题。
Andreas Bonini answered 2019-06-12T18:21:24Z
0 votes
表得到的越大(如在其中的更多行中),如果没有索引,通常会运行较慢的查询。 添加正确的索引后,您的查询性能应该提高或至少不会随着表的增长而降低。 但是,如果查询本身在表变大时返回更多行,那么您将再次开始看到降级。
虽然1M行不是那么多,但它还取决于您在数据库服务器上有多少内存。 如果表太大而无法由服务器缓存在内存中,则查询速度会变慢。
jvilalta answered 2019-06-12T18:21:56Z
0 votes
由于使用排序合并方法对数据进行排序,因此使用提供的查询将非常慢。
我建议重新考虑设计,以便您使用索引来检索它或确保它已经以这种方式排序,因此不需要排序。
Louis answered 2019-06-12T18:22:28Z