12
返回列表 发新帖
楼主: prayer21

如何提高innodb insert into select的插入速度

[复制链接]
论坛徽章:
4
2011新春纪念徽章
日期:2011-02-18 11:42:49ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51现代
日期:2013-11-04 14:48:19现代
日期:2013-11-08 10:33:53
11#
 楼主| 发表于 2014-6-26 13:13 | 只看该作者
lujinke 发表于 2014-6-26 09:55
跟你说了解决思路你还不信,自行去MySQL文档找找有关fast index creation相关的内容吧

谢谢!

使用道具 举报

回复
论坛徽章:
7
2014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:31技术图书徽章
日期:2014-04-04 13:33:56懒羊羊
日期:2015-02-09 17:00:14喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2015-07-03 17:00:53
12#
发表于 2014-6-30 20:31 | 只看该作者
是不是可以select outfile,然后在load data infile呢?

使用道具 举报

回复
论坛徽章:
3
懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18蒙奇·D·路飞
日期:2017-09-21 11:23:37
13#
发表于 2014-7-1 12:00 | 只看该作者
本帖最后由 lujinke 于 2014-7-1 12:01 编辑
i6first 发表于 2014-6-30 20:31
是不是可以select outfile,然后在load data infile呢?

本质上慢的原因是因为表大之后,每次插入索引更新代价大(包括主键索引),INNODB对于非唯一的二级索引是可以使用insert buffer的,可以在一定程度上改进插入性能,但是对于unique的二级索引,就没办法了采用insert buffer了,此时只有在导入前删除该索引才能从根本上解决这个问题(当然主键没办法,后面会提到),等数据导入过后,再重建这些索引,5.5版本之后MySQL有一种称为fast index creation的技术,可以快速重建索引(可以参考Online DDL相关的内容),但是这种技术对主键行不通,因为重建主键索引,需要重建整张表

PS:disable keys和set unique checks=0对innodb表不起作用

使用道具 举报

回复
论坛徽章:
5
复活蛋
日期:2012-11-02 16:27:37灰彻蛋
日期:2013-01-27 17:08:112013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2013-05-27 15:29:10优秀写手
日期:2014-07-01 06:00:12
14#
发表于 2014-7-2 11:42 | 只看该作者
8.5.4 Bulk Data Loading for InnoDB Tables
1)When importing data into InnoDB, turn off autocommit mode
2)If you have UNIQUE constraints on secondary keys, you can speed up table imports by temporarily turning off the uniqueness checks during the import session
3)If you have FOREIGN KEY constraints in your tables, you can speed up table imports by turning off the foreign key checks for the duration of the import session
4)Use the multiple-row INSERT syntax to reduce communication overhead between the client and the server if you need to insert many rows:
5)When doing bulk inserts into tables with auto-increment columns, set innodb_autoinc_lock_mode to 2 instead of the default value 1

8.2.2.1 Speed of INSERT Statements
1)If you are adding data to a nonempty table, you can tune the bulk_insert_buffer_size variable to make data insertion even faster
2)When loading a table from a text file, use LOAD DATA INFILE. This is usually 20 times faster than using INSERT statements.

使用道具 举报

回复
论坛徽章:
5
复活蛋
日期:2012-11-02 16:27:37灰彻蛋
日期:2013-01-27 17:08:112013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2013-05-27 15:29:10优秀写手
日期:2014-07-01 06:00:12
15#
发表于 2014-7-2 11:48 | 只看该作者
insert into select * from  和 create table select * from 执行过程中,如果是RR隔离级别,则会对原表加锁,最好通过使用:
select * from ... into outfile 和 load data infile ... 语句来改写。

使用道具 举报

回复
论坛徽章:
4
2011新春纪念徽章
日期:2011-02-18 11:42:49ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51现代
日期:2013-11-04 14:48:19现代
日期:2013-11-08 10:33:53
16#
 楼主| 发表于 2014-7-2 14:54 | 只看该作者
lujinke 发表于 2014-7-1 12:00
本质上慢的原因是因为表大之后,每次插入索引更新代价大(包括主键索引),INNODB对于非唯一的二级索引是 ...

谢谢

我最近看了下有关fast index creation的内容,在5.1中就可以用了,不过需要innodb plugin,我这的线上版本是5.1.57,但是没有装。。

打算最近测试下pt-online-schema-change不知道好不好用。。

使用道具 举报

回复
论坛徽章:
4
2011新春纪念徽章
日期:2011-02-18 11:42:49ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51现代
日期:2013-11-04 14:48:19现代
日期:2013-11-08 10:33:53
17#
 楼主| 发表于 2014-7-2 14:57 | 只看该作者
digdeep126 发表于 2014-7-2 11:48
insert into select * from  和 create table select * from 执行过程中,如果是RR隔离级别,则会对原表加锁 ...

谢谢,,

我这边线上的都是RC级别的,,
好几个网友提出用 load data,但我们这边几乎不用这个来导数据,,
有时PM 要数据的时候,我们会用select * from ... into outfile导出来给他们,一般情况下,这两个都不怎么用。。

使用道具 举报

回复
论坛徽章:
10
2011新春纪念徽章
日期:2011-02-18 11:43:342015年新春福章
日期:2015-03-06 11:58:18懒羊羊
日期:2015-03-04 14:52:11马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09优秀写手
日期:2013-12-18 09:29:11三菱
日期:2013-08-30 20:37:412013年新春福章
日期:2013-02-25 14:51:24ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51暖羊羊
日期:2015-06-22 15:51:36
18#
发表于 2014-7-6 14:52 | 只看该作者
lujinke 发表于 2014-7-1 12:00
本质上慢的原因是因为表大之后,每次插入索引更新代价大(包括主键索引),INNODB对于非唯一的二级索引是 ...

set unique checks=0对innodb表不起作用??
应该是有作用的,innodb会临时将unique key当成normal key,并用到insert buffer

使用道具 举报

回复
论坛徽章:
3
懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18蒙奇·D·路飞
日期:2017-09-21 11:23:37
19#
发表于 2014-7-6 21:31 | 只看该作者
myownstars 发表于 2014-7-6 14:52
set unique checks=0对innodb表不起作用??
应该是有作用的,innodb会临时将unique key当成normal key,并 ...

你试试就知道起不起作用了

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表