一、大批量插入数据
1.大批量数据插入空表,可将表设置成为MyISAM,并通过disable keys将唯一索引关闭
2.大批量数据插入非空Innodb表,可采取如下措施提高效率:
[1]导入数据时按照主键顺序排列;
[2]导入数据前使用set UNIQUE_CHECKS=0,关闭唯一性校验,导入后恢复;
[3]如果使用了自动提交,建议在导入前执行SET AUTOCOMMIT=0,关闭自动提交,导入后恢复
二、优化INSERT语句
1.尽量使用多个值表的insert语句,降低连接、关闭的消耗;
2.将索引文件和数据文件分在不同的磁盘上存放;
3.从一个文本文件装入一个表时,使用LOAD DATA INFLIE ,比一般的insert语句快20倍;
三、查询优化
1.尽量减少额外的排序,通过索引直接返回有序数据;where条件和order by使用相同的索引,并且order by的顺序与索引顺序相同,并且order by的字段都是升序或者都是降序;
2.尽量只选择必要的字段,提高sql性能;
3.能用关联查询的不要用子查询;
4.对于包含or的查询语句,如果要利用索引,则or之间的每个条件都必须用到索引,否则应该考虑增加索引;
5.优化分页
[1]在索引上完成排序分页的操作,然后根据主键关联回原表查询所需的其他列
[2]把limit查询转换为某个位置的查询;
四、 注意不使用索引的情况
- 如果MySQL估计使用索引比全表扫描更慢,则不使用索引
- 用or分隔开的条件,如果or前的条件中的列有索引,而后面的列没有索引,那么涉及到的索引都不会被用到;
- 复合索引,如果索引列不是复合索引的第一部分,则不使用索引(即不符合最左前缀);
- 如果like是以’%’开始的,则该列上的索引不会被使用
- 如果列为字符串,则where条件中必须将字符常量值加引号,否则即使该列上存在索引,也不会被使用;
- not in 、 not exists 、 (<> 不等于 !=)这些操作符不走索引
- 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引;