所以我有一个表可以获得相对较好的插入性能(每秒插入2500-3000行)但是一旦它比我分配的内存(2gb)大,它会减慢15倍...最糟糕的是它最终会增长到20g左右......
看起来像这样:
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
我认为发生的原因是因为我检查插件是否重复(INSERT IGNORE)所以MySQL服务器需要检查所有唯一索引值 - 并且由于它们不再适合内存,它具有使用速度慢得多的磁盘I / O.
我决定将我的桌子分区 - >我制作了30个范围,将5000万行分成30个部分(按customerid字段的范围)。
但是当我达到内存限制时,它会慢下来。
是否有任何技巧可以保持插入高?这个人(http://www.slideshare.net/bluesmoon/scaling-mysql-writes-through-partitioning-3397422)似乎使用分区取得了巨大的成功。我的问题是我的数据不按顺序排列,所以我不能简单地将行追加到索引的最后一个位置(有时它会插入到表的中间,有时在开头,有时在结尾等)。
如何构建键以获得最高的插入/选择性能?在我看来,有一些明显的事情我可以做(除了获得更多的RAM)以保持高速。
如果任何MySQL天才正在读这篇文章 - 请花一点时间帮助我。