Mysql 当您的表没有';我记不起来了?

Mysql 当您的表没有';我记不起来了?,mysql,sql,performance,insert,partitioning,Mysql,Sql,Performance,Insert,Partitioning,因此,我有一个表,它的插入性能相对较好(每秒插入2500-3000行),但一旦它超过我分配的内存(2gb),速度就会降低15倍。。。最糟糕的是它最终会增长到20gb左右 看起来是这样的: CREATE TABLE `slots` ( `customerid` int(11) NOT NULL, `orderid` int(11) NOT NULL, `queueid` int(11) NOT NULL AUTO_INCREMENT, `item_id` int(3) NOT NULL,

因此,我有一个表,它的插入性能相对较好(每秒插入2500-3000行),但一旦它超过我分配的内存(2gb),速度就会降低15倍。。。最糟糕的是它最终会增长到20gb左右

看起来是这样的:

CREATE TABLE `slots` (
 `customerid` int(11) NOT NULL,
 `orderid` int(11) NOT NULL,
 `queueid` int(11) NOT NULL AUTO_INCREMENT,
 `item_id` int(3) NOT NULL,
 `variable1` int(3) NOT NULL,
 `variable2` int(3) NOT NULL,
 `variable3` int(3) NOT NULL,
 `variable4` int(3) NOT NULL,
 `variable5` int(3) NOT NULL,
 `variable6` int(3) NOT NULL,
 `variable7` tinyint(1) NOT NULL,
 `variable8` tinyint(1) NOT NULL,
 `variable9` tinyint(1) NOT NULL,
 PRIMARY `queueid` (`queueid`, `customerid`),
 UNIQUE KEY `customerid` (`customerid`,`orderid`)
) ENGINE=InnoDB AUTO_INCREMENT=25883472 DEFAULT CHARSET=latin1
我之所以认为会发生这种情况,是因为我检查了插入是否重复(插入忽略),所以MySQL服务器需要检查所有唯一的索引值——而且由于它们不再适合内存,它必须使用速度慢得多的磁盘I/O

我决定对我的表进行分区->我已经创建了30个范围,将5000万行分成30个部分(按customerid字段的范围)

但当我达到记忆极限时,速度还是变慢了

有什么技巧可以保持插入高?这个家伙()似乎非常成功地使用了分区。我的问题是,我的数据不是按顺序排序的,所以我不能简单地将行追加到索引中的最后一个位置(有时它会插入表中间,有时在开始,有时在结尾)。 如何构造键以获得尽可能高的插入/选择性能?在我看来,有一些明显的事情,我可以做(除了获得更多的内存),以保持高速


如果有MySQL天才正在阅读本文,请花一分钟时间帮助我。

为什么要按顺序插入数据?你能重新构造你的表和应用程序以使用为写优化的表,然后使用索引优化有限数量的读取吗?你是说我应该删除自动增量字段?这不会降低性能吗?我应该放弃这个领域吗?一旦我插入完数据(以及更小的、连续的新数据插入流),这个表将得到频繁的选择。我认为创建这个表的另一个读优化副本将消耗大量的RAM,而我已经很少了…如果它是一个自动增量,并且增量步骤始终是确定的和积极的,这是否意味着数据总是插入到最后——或者至少插入到最近的分区?删除自动递增意味着您必须使用其他方法来确定主键(并确保其在并行插入中的唯一性),但不应更改插入行为,除非您对表应用了某种排序方法。删除自动递增字段并使customerid字段成为主键(一列而不是两列组合)提高选择/插入性能?我将对此进行测试,只是想知道这是否可行(因为检查至少需要6个小时)不幸的是,我不确定,这就是为什么我不想将此作为答案发布。最好的答案始终是使用您的特定用例和数据集进行测试。祝您好运!