MySQL性能优化指南

MySQL性能优化指南

本文的主要目标是介绍如何优化MySQL数据库,经过按期分析表和检查表、按期优化表以及一些经常使用SQL语句的优化手段,能够帮助你学会在MySQL开发中编写更为高效的SQL。

 

一、按期分析表和检查表

分析表的语法以下:html

ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb1_name[, tbl_name]...

以上语句用于分析和存储表的关键字分布,分析的结果将可使得系统获得准确的统计信息,使得SQL可以生成正确的执行计划。若是用户感受实际执行计划并非预期的执行计划,执行一次分析表可能会解决问题。在分析期间,使用一个读取锁定对表进行锁定。这对于MyISAM,DBD和InnoDB表有做用。mysql

例如分析一个数据表sql

analyze table table_name

检查表的语法以下:数据库

CHECK TABLE tb1_name[,tbl_name]...[option]...option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}

检查表的做用是检查一个或多个表是否有错误,CHECK TABLE 对MyISAM 和 InnoDB表有做用,对于MyISAM表,关键字统计数据被更新性能优化

CHECK TABLE 也能够检查视图是否有错误,好比在视图定义中被引用的表不存在。性能

2. 按期优化表

优化表的语法以下:优化

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb1_name [,tbl_name]...

若是删除了表的一大部分,或者若是已经对含有可变长度行的表(含有 VARCHAR、BLOB或TEXT列的表)进行更多更改,则应使用OPTIMIZE TABLE命令来进行表优化。这个命令能够将表中的空间碎片进行合并,而且能够消除因为删除或者更新形成的空间浪费,但OPTIMIZE TABLE 命令只对MyISAM、 BDB 和InnoDB表起做用。code

例如: optimize table table_nameorm

注意: analyze、check、optimize执行期间将对表进行锁定,所以必定注意要在MySQL数据库不繁忙的时候执行相关的操做。htm

经常使用的SQL优化

咱们在开发的时候经常用到的SQL语句,无非是INSERT、GROUPBY等等。对于这些SQL语句,咱们怎么进行优化?

1. 大批量插入数据

  • 当用load命令导入数据的时候,适当的设置能够提升导入的速度。
  • 对于MyISAM存储引擎的表,能够经过以下方式快速的导入大量的数据

代码以下:

ALTER TABLE tb1_name DISABLE KEYS; 
loading the data 
ALTER TABLE tb1_name ENABLE KEYS;

DISABLE KEYS 和 ENABLE KEYS 用来打开或者关闭MyISAM表非惟一索引的更新。在导入大量的数据到一个非空的MyISAM表时,经过设置这两个命令,能够提升导入的效率。

对于导入大量的数据到一个空的MyISAM表时,默认就是先导入数据而后才建立索引的,索引不用进行设置。

load data infile '/home/mysql/text_txt' into table text

对于InnoDB类型的表,这种方式不能提升导入数据的效率,但也有几种针对InnoDB类型的表进行优化的方式。

1. 由于InnoDB类型的表式按照主键的顺序保存的,因此将导入的数据按照主键的顺序排序,能够有效提升导入数据的效率。

2. 在导入数据前执行 SET UNIQUE_CHECKS=0,关闭惟一性校验,在导入结束后执行SET UNIQUE_CHECKS=1,恢复惟一性校验,能够提升导入的效率。

3. 若是应用使用自动提交的方式,建议在导入前执行SET AUTOCOMMIT=0,关闭自动提交,导入结束后执行SET AUTOCOMMIT=1,打开自动提交,也能够提升导入效率。

优化INSERT语句

当进行数据INSERT的时候,能够考虑采用如下几种方式进行优化

1. 若是同时从一个客户插入不少行,尽可能使用多个值表的INSERT语句,这种方式将大大缩短客户端与MySQL数据库的连接、关闭等消耗,使得效率比分开执行的单个INSERT语句快.

例如:

insert into test values(1,2) 
insert into test values(3,4) 
insert into test values(5,6)

将上面三句改成:insert into test values(1,2),(3,4),(5,6)……

2. 若是从不一样客户插入不少行,能经过使用INSERT DELAYED 语句获得更高的速度。

DELAYED 的含义是让INSERT 语句立刻执行,其实数据都被放在内存的队列中,并无真正写入磁盘,这比每条语句分别插入要快得多;LOW_PRIORITY恰好相反,在全部其余用户对表的读写完后才进行插入。

3. 将索引文件和数据文件分在不一样的磁盘上存放

4. 若是进行批量插入,能够增长bulk_insert_buffer_size变量值的方法来提升速度,可是,这只能对于MyISAM表使用。

5. 当从一个文本文件中装载一个表时,使用LOAD DATA INFILE。 这一般比使用不少insert语句快20倍左右。

以上是MySQL 性能优化的一些其它须要注意的地方,你们结合和,充分发挥mysql的性能。