SQL性能优化的小技巧三
十三、批量插入性能提升 1、多条提交
INSERT INTO user (id,username) VALUES(1,哪吒编程);
INSERT INTO user (id,username) VALUES(2,妲己); 1 2 3 2、批量提交
INSERT INTO user (id,username) VALUES(1,哪吒编程),(2,妲己); 1 3、理由
默认新增SQL有事务控制,导致每条都需要事务开启和事务提交,而批量处理是一次事务开启和提交,效率提升明显,达到一定量级,效果显著,平时看不出来。
十四、表连接不宜太多,索引不宜太多,一般5个以内 1、表连接不宜太多,一般5个以内
关联的表个数越多,编译的时间和开销也就越大 每次关联内存中都生成一个临时表 应该把连接表拆开成较小的几个执行,可读性更高 如果一定需要连接很多表才能得到数据,那么意味着这是个糟糕的设计了 阿里规范中,建议多表联查三张表以下 2、索引不宜太多,一般5个以内
索引并不是越多越好,虽其提高了查询的效率,但却会降低插入和更新的效率; 索引可以理解为一个就是一张表,其可以存储数据,其数据就要占空间; 索引表的数据是排序的,排序也是要花时间的; insert或update时有可能会重建索引,如果数据量巨大,重建将进行记录的重新排序,所以建索引需要慎重考虑,视具体情况来定; 一个表的索引数最好不要超过5个,若太多需要考虑一些索引是否有存在的必要; 十五、避免在索引列上使用内置函数 1、反例
SELECT * FROM user WHERE DATE_ADD(birthday,INTERVAL 7 DAY) >=NOW(); 1 2、正例
SELECT * FROM user WHERE birthday >= DATE_ADD(NOW(),INTERVAL 7 DAY); 1 3、理由
使用索引列上内置函数,索引失效。
十六、组合索引 排序时应按照组合索引中各列的顺序进行排序,即使索引中只有一个列是要排序的,否则排序性能会比较差。
create index IDX_USERNAME_TEL on user(deptid,position,createtime); select username,tel from user where deptid= 1 and position = java开发 order by deptid,position,createtime desc; 1 2 实际上只是查询出符合 deptid= 1 and position = java开发条件的记录并按createtime降序排序,但写成order by createtime desc性能较差。