12、MySQL中经常使用的SQL优化 - 系统的撸一遍MySQL

插入优化

MyISAM批量导入

非空的表导入的时候会同时处理索引,致使导入效率低下,因此经过如下方式能够快速导入。sql

//关闭非惟一索引
ALTER TABLE table_name DISABLE KEYS;
load data infile 'path' in to table table_name;
//开启非惟一索引
ALTER TABLE table_name ENABLE KEYS;

InnoDB批量导入

一、按主键顺序导入,InnoDB的数据按主键排列的B+Tree结构,因此数据按主键排序能够提高效率。优化

二、关闭惟一性校验spa

//关闭惟一校验
SET UNIQUE_CHECKS=0;
load data infile 'path' in to table table_name;
//开启惟一校验
SET UNIQUE_CHECKS=1;

三、关闭自动提交线程

//关闭自动提交
SET AUTOCOMMIT=0;
load data infile 'path' in to table table_name;
//提交数据
COMMIT;
//开启自动提交
SET AUTOCOMMIT=1;

INSERT优化

一、合并多条INSERT语句,减小客户端与MySQL的通信次数,减小SQL解析次数。code

二、采用 INSERT DELAYED当即执行SQL语句(在内存中,以后写入到硬盘)。排序

三、表分区、独立表空间,将数据分布在不一样硬盘提升IO吞吐量。索引

查询优化

ORDER BY语句

两种排序方式

排序工做若是查询的数据在索引中,能够直接经过索引返回数据(using index),不然进行filesort。内存

filesort会在每一个线程的 sort_buffer_size规定的排序区进行排序,若是超过size大小,会在硬盘进行归并排序。it

两种filesort排序方式

一、两次排序table

读取排序字段和条件字段在sort_buffer中进行排序,若是超过大小会在硬盘中排序。排序完成后读取硬盘数据。这种方式节省内存,可是可能形成大量IO。

二、一次扫描

一次去处全部知足条件的字段,而后在sort_buffer中排序,排序后直接返回。这种方式效率高可是消耗内存比较大,容易致使大量swap。

MySQL经过 max_length_for_sort_data来决定使用哪种方式进行排序。

排序优化方式

一、尽可能使用索引进行排序,同时减小排序返回的字段

二、根据实际状况权衡后,调整sort_buffer的大小

三、经过调整排序字段顺序,充分利用索引排序。

四、适当的limit语句来避免全表扫描。

GROUP BY 语句

group by默认会对分组字段进行排序,因此使用 order by null能够减小排序损耗。

上图中第二个语句没有了filesort。

子查询

使用 join 来代替字查询。

能够看到rows减小了很是多。

索引控制

//建议使用索引
SELECT * FROM user use index(索引名);
//忽略某个索引
SELECT * FROM user ignore index(索引名);
//强制使用索引
SELECT * FROM user force index(索引名);
相关文章
相关标签/搜索