`
kavy
  • 浏览: 868318 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Mysql insert性能优化

 
阅读更多
Mysql insert性能优化
2012-02-20 16:41:15     我来说两句      
收藏    我要投稿
Mysql优化之加速INSERT插入一条记录花费的时间由以下几个因素决定,数字表示影响的比例:
 
连接:(3)
 
发送查询给服务器:(2)
 
解析查询:(2)
 
插入记录:(1*记录大小)
 
插入索引:(1*索引数量)
 
关闭:(1)
 
此处没有考虑初始化时打开数据表的开销,因为每次运行查询只会做这么一次。
 
如果是B-tree索引,随着索引数量的增加,插入记录的速度以logN的比例下降。
 
可以用以下几种方法来提高插入速度:
 
如果要在同一个客户端在同一时间内插入很多记录,可以使用INSERT语句附带有多个values值。这种做法比使用单一值的INSERT语句快多了(在一些情况下比较快)。如果是往一个非空数据表增加记录,可以调整变量bulk_insert_buffer_size的值使其更快。
 
如果要从不用的客户端插入大量记录,使用INSERT DELAYED语句也可以提高速度。
 
对应MyISAM,可以在SELECT语句正在运行时插入记录,只要这时候没有正在删除记录。
 
想要将一个文本文件加载到数据表中,可以使用LOAD DATA INFILE。这通常是使用大量INSERT语句的20倍。
 
通过一些额外工作,就可以让LOAD DATA INFILE在数据表有大量索引的情况下运行更快。步骤如下:
 
用create table随表建一个表
 
执行FLUSH TABLES语句或mysqladmin flush-tables命令
 
执行myisamchk –keys-used=0 -rq /path/to/db/tbl_name命令,删除数据表所有索引。
 
执行LOAD DATA INFILE,数据插入到表中,由于无需更新表索引,因此这将非常快。
 
如果将来只是读取该表,运行myisampack让数据表更小。
 
运行myisamchk -r -q /path/to/db/tbl_name重建索引。创建的索引树在写入磁盘前先保存在内存中,这省去了磁盘磁盘搜索,因此速度快很多。重建后的索引树分布非常均衡。
 
执行FLUSH TABLES语句或mysqladmin flush-tables命令
 
注意,在Mysql 4.0起,可以运行ALTER TABLE tbl_name DISABLE KEYS来代替myisamchk –keys-used=0 -rq /path/to/db/tbl_name.运行ALTER TABLE tbl_name ENABLE KEYS代替myisamchk -r -q /path/to/db/tbl_name.这么做就可以省去FLUSH TABLES步骤。
 
 
 
可以在锁表后,一起执行几个语句来加速INSERT操作:
 
LOCK TABLES a WRITE;
 
INSERT INTO a VALUES(1,23),(2,23);
 
INSERT INTO a VALUES(8,7);
 
UNLOCK TABLES;
 
这对性能提高的好处在于:直到所有的INSERT语句都完成之后,索引缓存一次性刷新到磁盘中。通常情况下,有多少次INSERT语句就会有多少次索引缓存刷新到磁盘中的开销。如果能在一个语句中一次性插入多个值的话,显然锁表操作也没有必要了。对于事务表而言,用BEGIN/COMMIT代替LOCK TABLES来提高速度。锁表也会降低多次连接测试的总时间,尽管每个独立连接为了等待锁的最大等待时间也会增加。
 
Connection 1 does 1000 inserts
 
Connection 2,3 and 4 do 1 insert
 
Connection 5 does 1000 inserts
 
如果没有锁表,则连接2,3,4会在1,5之前完成。如果锁表了,则连接2,3,4可能在1,5之后才能完成,但总时间可能只需要40%。Mysql的INSERT、UPDATE、DELETE操作都非常快,不过在一个语句中如果超过5个插入或者更新时最好加锁以得到更好的性能。如果要一次性做很多次插入,最好在每个循环的前后加上LOCK TABLES和UNLOCK TABLES,从而让其他进程也能访问数据表;这么做性能依然不错。INSERT总比LOAD DATA INFILE插入数据慢,因为二者实现策略有分明的不同。
 
想要MyISAM表更快,在LOAD DATA INFILE和INSERT时都可以增加系统变量key_buffer_size的值。
 
分享到:
评论

相关推荐

    MySQL优化insert性能的方法示例

    MySQL性能优化 MySQL性能优化就是通过合理安排资源,调整系统参数使MySQL运行更快、更节省资源。MySQL性能优化包括查询速度优化、更新速度优化、MySQL服务器优化等。本篇博客将从查询优化、数据库结构优化、MySQL...

    如何优化MySQL insert性能

    因此,提高大数据量系统的MySQL insert效率是很有必要的。  经过对MySQL的测试,发现一些可以提高insert效率的方法,供大家参考参考。  1、一条SQL语句插入多条数据。  常用的插入语句如: INSERT INTO `...

    MySQL批量SQL插入性能优化详解

    经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。 1. 一条SQL语句插入多条数据。 常用的插入语句如: INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) ...

    MySQL中索引优化distinct语句及distinct的多字段操作

    在一些情况下,MySQL可以使用索引优化DISTINCT操作,但需要活学活用.本文涉及一个不能利用索引完成DISTINCT操作的实例.   实例1 使用索引优化DISTINCT操作 create table m11 (a int, b int, c int, d int, primary ...

    MySQL实现批量插入以优化性能的教程

    经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。 1. 一条SQL语句插入多条数据。 常用的插入语句如:   INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `...

    MySQL性能优化技巧分享

    MySQL性能优化 在互联网公司MySQL的使用非常广泛,大家经常会有MySQL性能优化方面的需求。整理了一些在MySQL优化方面的实用技巧。 Schema与数据类型优化 整数通常是标识列最好的选择,因为它们很快并且可以使用...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    第十五部 MySQL数据库优化思想与优化实战(9节) 1-网站打开慢mysql问题多解决方案企业案例.avi 2-MySQL索引优化要点精讲01 3-MySQL索引优化生产案例讲解02 4-linux运维人员必须掌握的核心经验案例.avi MySQL数据库...

    MySQL批量SQL插入性能优化

     经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。  1. 一条SQL语句插入多条数据。  常用的插入语句如:  INSERT INTO `insert_table` (`datetime`, `uid`, `...

    Java面试准备:数据库MySQL性能优化

    为查询缓存优化你的查询 EXPLAIN你的SELECT查询 当只要一行数据是使用LIMIT 1 为搜索字段建索引 在Join表的时候使用相当类型的列,并将其索引 千万不要ORDER BY RAND() 避免SELECT * 永远为每张表设置一个ID 使用...

    淘宝内部分享:MySQL&MariaDB性能优化

    但是MySQL数据库的默认设置性能非常的差,必须进行不断的优化,而优化是一个复杂的任务,本文描述淘宝数据库团队针对MySQL数据库MetadataLock子系统的优化,hash_scan算法的实现解析的性能优化,TokuDB·版本优化,...

    MySql 5.1 参考手册.chm

    7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. ...

    MYSQL

    10.5.2 SELECT 查询的速度 10.5.3 MySQL 怎样优化WHERE子句 10.5.4 MySQL 怎样优化LEFT JOIN 10.5.5 MySQL 怎样优化LIMIT 10.5.6 INSERT查询的速度 10.5.7 UPDATE查询的速度 10.5.8 ...

    MYSQL开发性能研究之批量插入数据的优化方法

    一、我们遇到了什么问题 在标准SQL里面,我们通常会写下如下的SQL insert语句...正是由于性能的瓶颈问题,MYSQL官方文档也就提到了使用批量化插入的方式,也就是在一句INSERT语句里面插入多个值。即, INSERT INTO TBL

    MySQL 5.1参考手册

    7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT ...

    MySQL中文参考手册.chm

    10.5.2 SELECT 查询的速度 10.5.3 MySQL 怎样优化WHERE子句 10.5.4 MySQL 怎样优化LEFT JOIN 10.5.5 MySQL 怎样优化LIMIT 10.5.6 INSERT查询的速度 10.5.7 UPDATE查询的速度 ...

    MySQL 5.1中文手冊

    7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. ...

    Mysql批量插入更新性能优化

    对于数据量较大的插入和更新,因io/cpu等性能瓶颈,会产生大量的时间消耗,目前主流的优化主要包括预编译、单条sql插入多条数据、事务插入等,下面详细介绍一下:  单条插入(Mybatis)  INSERT INTO SYS_CITY ...

    MySQL中文参考手册

    * 1 MySQL的一般的信息 o 1.1 什么是MySQL? o 1.2 关于本手册 + 1.2.1 本手册中使用的约定 o 1.3 MySQL的历史 o 1.4 MySQL的主要特征 o 1.5 MySQL稳定性? o 1.6 顺应2000年 o 1.7 SQL一般信息和教程 o ...

    MySQL 5.1官方简体中文参考手册

    7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. ...

Global site tag (gtag.js) - Google Analytics