数据库中有多less行太多?

我有一个具有1,000,000条logging的MySQL InnoDB表。 这太多了吗? 或者数据库可以处理这个和更多? 我问,因为我注意到一些查询(例如,从表中获取最后一行)在1毫米行中比在100行中慢(秒)。

我有一个带有1000000个寄存器的MySQL InnoDB表。 这太多了吗?

不,对于数据库来说,1,000,000 (AKAlogging)不是太多。

我问,因为我注意到有一些查询(例如,获取表的最后一个寄存器)在有100万个寄存器的表中比在100个具有100个寄存器的表中慢(秒)。

声明中有很多要说明的。 通常的嫌疑人是:

  1. 写得不好的查询
  2. 不使用主键,假设表中存在一个主键
  3. devise不佳的数据模型(表结构)
  4. 缺乏指标

我有一个超过97,000,000条logging( 30GB数据文件 )的数据库,没有问题。

只记得定义和改进你的表索引

所以很显然, 100万不是很多! (但是,如果你不索引,是的,这是很多)

使用'explain'来检查你的查询,看看查询计划是否有问题。

我认为这是一个常见的误解 – 在数据库可伸缩性方面,大小只是等式的一部分。 还有其他问题很难(或者更难):

  • 工作集有多大(即需要将多less数据加载到内存中并进行有效的工作)。 如果你只是插入数据,然后不做任何事情,这实际上是一个容易解决的问题。

  • 什么级别的并发是必需的? 是只有一个用户插入/阅读,还是我们有成千上万的客户一次运行?

  • 什么水平的承诺/耐久性和性能一致性是必需的? 我们必须确保我们能够兑现每一项承诺。 如果平均交易速度很快,或者我们希望确保所有交易可靠地快速进行(六西格玛质量控制就像 – http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization-和六西格玛/ )。

  • 你需要做任何操作的问题,如ALTER表架构? 在InnoDB中这是可能的,但是速度很慢,因为它经常需要在前台创build一个临时表(阻塞所有连接)。

所以我要陈述两个限制性的问题将是:

  • 你自己的写作技巧/索引很好。
  • 在ALTER TABLE语句中可以容忍多less痛苦等待。

我已经看到有数十亿(索引)logging的非分区表,它们自己进行分析工作。 我们最终分割了这个东西,但是老实说,我们没有看到太大的差别。

这就是说,这是在Oracle中,我还没有testingMySQL中的数据量。 索引是你的朋友:)

如果你的意思是100万行,那么这取决于你的索引是如何完成的以及硬件的configuration。 一百万行对于企业数据库来说不是一个大数目,甚至对于体面的设备来说也是一个开发数据库。

如果你的意思是100万列(不确定这甚至可能在MySQL中),那么是的,这似乎有点大,可能会导致问题。

寄存器? 你的意思是logging?

现在一百万条logging对于一个数据库来说并不是什么大不了的事情。 如果遇到任何问题,可能不是数据库系统本身,而是您正在运行的硬件。 最有可能的是,在用完硬件之前,你不会碰到数据库的问题。

现在,显然有些查询比其他查询更慢,但是如果两个非常相似的查询在极其不同的时间运行,则需要弄清楚数据库的执行计划是什么,并对其进行优化,即使用正确的索引,适当的规范化等。

顺便说一下,从逻辑的angular度来看,表格中没有“最后”的logging,没有固有的顺序。

假设你的意思是“logging”是“寄存器”,那么它不会太多,MySQL可以很好地扩展,并且可以容纳尽可能多的logging。

很明显,虽然search查询会更慢。 除了确保字段被正确编入索引之外,真的没有办法。

表越大(如同更多的行),如果没有索引,较慢的查询通常会运行。 一旦你添加了正确的索引,你的查询性能应该会提高,或者至less不会像表增长一样降级。 但是,如果查询本身在表变大时返回更多行,则会再次看到降级。

虽然1M行不是那么多,但这也取决于您在数据库服务器上有多less内存。 如果表太大而无法被服务器caching在内存中,则查询将会变慢。

使用提供的查询将非常慢,因为使用sorting合并方法来sorting数据。

我build议重新考虑devise,以便使用索引来检索它,或者确保它已经以这种方式sorting,所以不需要sorting。