当表不适合内存时,分区是否会提高性能?

时间:2013-12-31 01:30:19

标签: mysql sql performance insert partitioning

所以我有一个表可以获得相对较好的插入性能(每秒插入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天才正在读这篇文章 - 请花一点时间帮助我。

0 个答案:

没有答案