SQL优化经历记录
1、DB2数据库存储过程sql优化经历
1、关联表的时候,字段的顺序最好按照表的索引的顺序去写,特别是关联的表比较大的时候,效果特别明显
2、如果一个表比较大,且在存储中的使用频度很高,可以考虑创建临时表,且建立索引。单表的索引数量应该尽量控制在5个以内,并且单个索引中的字段数不超过5个。
2、MYSQL优化记录
1、在mysql的like查询中,百分号加在关键词后面是走索引的,比如 select * like "张三%",而百分号在前面是不走索引的,比如 select * like "%张三",但也有例外。如果你的字段有id,a,b,c四列。而你对abc三列加了索引的话。那无论如何,like都会走索引的。因为如果能走覆盖索引的话。mysql会优先走覆盖索引。所以,尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描
2、如果针对某个字段的or是走索引的,针对多个字段的or是不走索引的。可以用union代替or。
3、in一般会走索引,但是当IN的取值范围较大时会导致索引失效,走全表扫描;not in在任何情况下都不会使用索引。一般来说, 尽量避免使用in 和not in。
4、exists、not exists一般会走索引,但某些情形下效率很差,所以尽量不要用
5、尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描,可以给字段添加默认值0,对0值进行判断。
6、尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描,可以将表达式、函数操作移动到等号右侧(a / 10 = 9 不走索引,a = 10 * 9走索引 )
7、当数据量大时,避免使用where 1=1的条件。用代码拼装sql时进行判断,没 where 条件就去掉 where,有where条件就加。
8、使用索引列作为条件进行查询时,需要避免使用<>或者!=等判断条件。
9、隐式类型转换不使用索引
10、 order by 条件要与where中条件一致,否则order by不会利用索引进行排序。当order by 中的字段出现在where条件中时,才会利用索引而不再二次排序,更准确的说,order by 中的字段在执行计划中利用了索引时,不用排序操作。这个结论不仅对order by有效,对其他需要排序的操作也有效。比如group by 、union 、distinct等。