【发布时间】:2010-12-27 22:03:31
【问题描述】:
我有一个包含 1,000,000 条记录的 MySQL InnoDB 表。这太多了吗?或者数据库可以处理这个以及更多?我之所以问,是因为我注意到在具有 100 行的表中,某些查询(例如,从表中获取最后一行)比具有 100 行的表中的查询要慢(秒)。
【问题讨论】:
标签: sql mysql database performance
我有一个包含 1,000,000 条记录的 MySQL InnoDB 表。这太多了吗?或者数据库可以处理这个以及更多?我之所以问,是因为我注意到在具有 100 行的表中,某些查询(例如,从表中获取最后一行)比具有 100 行的表中的查询要慢(秒)。
【问题讨论】:
标签: sql mysql database performance
我有一个包含超过 97,000,000 条记录(30GB 数据文件)的数据库,没有问题。
请记住定义和改进您的表格索引。
所以很明显 1,000,000 并不多! (但如果你不索引;是的,很多)
【讨论】:
我认为这是一个常见的误解 - 在数据库可扩展性方面,大小只是等式的一部分。还有其他困难(或更难)的问题:
工作集有多大(即需要在内存中加载多少数据并积极处理)。如果你只是插入数据,然后什么都不做,这实际上是一个很容易解决的问题。
需要什么级别的并发?是只有一个用户插入/读取,还是我们有成千上万的客户端同时操作?
需要什么级别的承诺/持久性和性能一致性?我们是否必须确保我们能够兑现每一次提交。平均交易速度是否可以,或者我们是否要确保所有交易都可靠快速(六西格玛质量控制,如 - http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization-and-six-sigma/)。
您是否需要执行任何操作问题,例如 ALTER 表架构?在 InnoDB 中这是可能的,但速度非常慢,因为它经常需要在前台创建一个临时表(阻塞所有连接)。
所以我要说明两个限制性问题是:
【讨论】:
我见过包含数十亿条(索引)记录的非分区表,它们自联接用于分析工作。我们最终对事物进行了分区,但老实说,我们并没有看到太大的区别。
也就是说,那是在 Oracle 中,我还没有在 MySQL 中测试过这么多的数据量。索引是你的朋友:)
【讨论】:
使用“解释”检查您的查询,看看查询计划是否有任何问题。
【讨论】:
EXPLAIN - 新手与否。
EXPLAIN ;) 会很好
使用提供的查询将异常缓慢,因为使用排序合并方法对数据进行排序。
我建议重新考虑设计,以便使用索引来检索它,或者确保它已经以这种方式排序,因此不需要排序。
【讨论】:
我有一个包含 1000000 个寄存器的 MySQL InnoDB 表。是不是太过分了?
不,1,000,000 行(AKA 记录)对于数据库来说并不算多。
我之所以问,是因为我注意到在具有 100 万个寄存器的表中,某些查询(例如,获取表的最后一个寄存器)比在具有 100 个寄存器的表中要慢(秒)。
这句话有很多要说明的地方。通常的嫌疑人是:
【讨论】:
表越大(因为其中的行越多),如果没有索引,查询通常会运行得越慢。添加正确的索引后,您的查询性能应该会随着表的增长而提高或至少不会降低。但是,如果随着表变大,查询本身返回更多行,那么您将再次开始看到降级。
虽然 1M 行并不多,但它还取决于您在 DB 服务器上有多少内存。如果表太大而无法被服务器缓存在内存中,那么查询会变慢。
【讨论】:
注册?你是说录音吗?
如今,一百万条记录对于数据库来说并不是什么大问题。如果您遇到任何问题,很可能不是数据库系统本身,而是您运行它的硬件。在您用尽硬件之前,您不会遇到数据库问题,很有可能。
现在,显然有些查询比其他查询要慢,但是如果两个非常相似的查询在完全不同的时间运行,您需要弄清楚数据库的执行计划是什么并针对它进行优化,即使用正确的索引、适当的规范化等.
顺便说一句,表中没有“最后”记录这样的东西,从逻辑的角度来看,它们没有内在的顺序。
【讨论】:
SELECT LAST_INSERT_ID() 而不是那个查询。
如果您的意思是 100 万行,那么这取决于您的索引是如何完成的以及您的硬件配置。一百万行对于企业数据库甚至体面设备上的开发数据库来说都不是很大。
如果您的意思是 100 万列(不确定这在 MySQL 中是否可行),那么是的,这似乎有点大,可能会导致问题。
【讨论】:
假设您指的是“寄存器”中的“记录”,不,它并不过分,MySQL 的扩展性非常好,可以在硬盘中容纳尽可能多的记录。
显然搜索查询会更慢。除了确保字段被正确索引之外,真的没有办法解决这个问题。
【讨论】: