非空的表导入的时候会同时处理索引,致使导入效率低下,因此经过如下方式能够快速导入。sql
//关闭非惟一索引 ALTER TABLE table_name DISABLE KEYS; load data infile 'path' in to table table_name; //开启非惟一索引 ALTER TABLE table_name ENABLE KEYS;
一、按主键顺序导入,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语句,减小客户端与MySQL的通信次数,减小SQL解析次数。code
二、采用 INSERT DELAYED当即执行SQL语句(在内存中,以后写入到硬盘)。排序
三、表分区、独立表空间,将数据分布在不一样硬盘提升IO吞吐量。索引
排序工做若是查询的数据在索引中,能够直接经过索引返回数据(using index),不然进行filesort。内存
filesort会在每一个线程的 sort_buffer_size规定的排序区进行排序,若是超过size大小,会在硬盘进行归并排序。it
一、两次排序table
读取排序字段和条件字段在sort_buffer中进行排序,若是超过大小会在硬盘中排序。排序完成后读取硬盘数据。这种方式节省内存,可是可能形成大量IO。
二、一次扫描
一次去处全部知足条件的字段,而后在sort_buffer中排序,排序后直接返回。这种方式效率高可是消耗内存比较大,容易致使大量swap。
MySQL经过 max_length_for_sort_data来决定使用哪种方式进行排序。
一、尽可能使用索引进行排序,同时减小排序返回的字段
二、根据实际状况权衡后,调整sort_buffer的大小
三、经过调整排序字段顺序,充分利用索引排序。
四、适当的limit语句来避免全表扫描。
group by默认会对分组字段进行排序,因此使用 order by null能够减小排序损耗。
上图中第二个语句没有了filesort。
使用 join 来代替字查询。
能够看到rows减小了很是多。
//建议使用索引 SELECT * FROM user use index(索引名); //忽略某个索引 SELECT * FROM user ignore index(索引名); //强制使用索引 SELECT * FROM user force index(索引名);