mysql innodb 插入慢_mysql – InnoDB插入速度非常慢,速度慢

我最近将我的项目表切换到InnoDB(认为关系将是一件好事).我正在使用PHP脚本一次索引大约500个产品.

存储word / ids关联的表:

CREATE TABLE `windex` (

`word` varchar(64) NOT NULL,

`wid` int(10) unsigned NOT NULL AUTO_INCREMENT,

`count` int(11) unsigned NOT NULL DEFAULT '1',

PRIMARY KEY (`wid`),

UNIQUE KEY `word` (`word`)

) ENGINE=InnoDB AUTO_INCREMENT=324551 DEFAULT CHARSET=latin1

另一个表存储产品ID /字ID关联:

CREATE TABLE `indx_0` (

`wid` int(7) unsigned NOT NULL,

`pid` int(7) unsigned NOT NULL,

UNIQUE KEY `wid` (`wid`,`pid`),

KEY `pid` (`pid`),

CONSTRAINT `indx_0_ibfk_1` FOREIGN KEY (`wid`) REFERENCES `windex` (`wid`) ON DELETE CASCADE ON UPDATE CASCADE,

CONSTRAINT `indx_0_ibfk_2` FOREIGN KEY (`pid`) REFERENCES `product` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=latin1

该脚本使用MyISAM进行测试,它可以相对快速地对产品进行索引(比InnoDB快得多).第一次在InnoDB中运行它的速度非常慢,但是在将更多的值嵌套在一起后,我最终加速了它(但还不够).

我认为innodb对于这种类型的东西要快得多,因为行级别的锁,但事实并非如此.

我构造了一个类似于下面的查询:

SELECT

title,keywords,upc,...

FROM product

WHERE indexed = 0

LIMIT 500

我创建一个循环并填充一个数组,其中包含需要添加到windex的所有单词以及需要添加到indx_0的所有单词id / product id对.

因为每当我执行“REPLACE INTO”或“INSERT IGNORE INTO”因为重复值而失败时,innodb会不断增加我的自动增量值,我需要确保我添加的值不存在.为此,我首先使用如下查询选择所有存在的值:

SELECT wid,word

FROM windex

WHERE

word = "someword1" or word = "someword2" or word = "someword3" ... ...

然后我根据存在的结果过滤掉我的数组,这样我添加的所有新单词都是100%新的.

这大约占总执行时间的20%.另外80%用于将对值添加到indx_0中,其中有更多值.

这是我得到的一个例子.

0.4806秒选择产品. (总共0.4807秒).

0.0319秒收集500件物品. (总共0.5126秒).

5.2396秒选择windex值进行比较. (总共5.7836秒).

1.8986秒更新计数. (总共7.6822秒).

添加832个windex记录0.0641秒. (总共7.7464秒).

17.2725秒添加3435 pid / wid对的索引. (总共25.7752秒).

操作花了26.07秒来索引500种产品.

3435对全部在一个查询中执行,例如:

INSERT INTO indx_0(pid,wid)

VALUES (1,4),(3,9),(9,2)... ... ...

在我的情况下,为什么InnoDB比MyISAM慢得多?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值