标杆管理有几个问题
INSERTs
. 随着插入的次数越来越多,速度也会发生变化,但不是以一种容易预测的方式。
插入的执行方式(大致)如下:
-
检查钥匙是否重复。您有两个唯一键(PK和唯一键)。将钻取每个BTree以检查dup。假设没有重复。。。
-
该行将插入数据中(由PK键控的BTree)
-
将在每个Unique的BTree中插入一个“行”。在您的情况下,有一个BTree有效地按(column1,column2)排序并包含(id)。
-
每个非唯一索引的内容都被放入“更改缓冲区”。
如果你有
AUTO_INCREMENT
或a
UUID
或会有更多的讨论。
更改缓冲区实际上是对非唯一索引的“延迟写入”。这种拖延最终必须得到解决。也就是说,在某些时候,如果后台进程不能跟上变化,事情会变慢。也就是说,如果插入100万行,可能不会遇到这种减速;如果插入1000万行,可能会命中它。
另一个变量:
VARCHAR(2048)
(和其他
TEXT
和
BLOB
列)
也许
或
可能不会
存储为“非记录”。这取决于行的大小、列的大小和“行格式”。一根大绳子
也许
额外的磁盘命中,从而降低基准测试的速度,可能会显著降低。也就是说,如果只使用小字符串和某些行格式进行基准测试,则插入时间会更快。
您需要了解基准测试程序的运行方式,而不是应用程序的运行方式:
-
在单个线程中一次插入一行,每一行都是一个事务。
-
在单个线程中一次插入一行,即批处理到事务中的批。
-
在单个事务的单个线程中一次插入100行。
-
加载数据。
-
以上各有多个线程。
-
不同的事务隔离设置。
-
等
(我不喜欢基准测试,因为它们有很多缺陷。)比较硬件或有限模式/应用程序更改的“最佳”基准:从正在运行的应用程序中捕获“常规日志”;在开始时捕获数据库;重新应用该日志的时间。
为每秒50K个插入行设计表/插入
-
最小化索引。就你而言,你只需要
PRIMARY KEY(col1, col2)
; 把剩下的扔掉;扔
id
. 请解释什么是col1和col2;这里可能有更多提示。
-
把桌子扔了。认真地说,请考虑每秒汇总50K行,并只存储摘要。如果可行,这将大大加快速度。或者一分钟的价值。
-
以某种方式批量插入行。此处的详细信息取决于是否有一个或多个客户端执行插入,是否需要在数据到达时对其进行按摩,等等。更多讨论:
http://mysql.rjweb.org/doc.php/staging_table
-
那些绳子里是什么?它们是否可以/应该“正常化”?
-
让我们讨论一下数学。你会在10点左右装货吗
拍字节
每年?你有那么多磁盘空间吗?您将如何处理这些数据?读取哪怕是一小部分数据都需要多长时间?还是将是一个“只写”数据库??
-
更多数学知识。50K行*0.5KB=每秒25MB写入磁盘。你有什么设备?它能处理,比如说,2倍的问题吗?(对于原始模式,由于所有索引,它更像是60MB/s。)
评论之后
好的,那么更像是3TB,然后再丢弃数据并重新开始(在2小时内)?为此,我建议
PARTITION BY RANGE
并使用一些时间函数,在每个分区中为您提供5分钟的时间。这将为您提供合理数量的分区(大约25个),并且
DROP PARTITION
将只减少大约100GB的容量,这可能不会淹没文件系统。更多讨论:
http://mysql.rjweb.org/doc.php/partitionmaint
至于字符串。。。您建议25KB,但声明不允许这么多???