sql优化总结

sql优化总结
一、大的架构方面:
分库分表、主从读写分离

二索引(查询)
接下来说一下索引:
哪些场景会造成索引生效
1、应尽量避免在 where 子句中使用 != 或 <> 操作符
否则引擎将放弃使用索引而进行全表扫描;
2、尽量避免在 where 子句中使用 or 来连接条件
否则将导致引擎放弃使用索引而进行全表扫描,即使其中有条件带索引也不会使用,这也是为什么尽量少用 or 的原因;
3、对于多列组合索引,不是使用的第一部分,则不会使用索引;
组合索引最左前缀原则
4、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引;
5、like的模糊查询以 % 开头,索引失效;
但是非前置模糊查询则可以:
select * from user where name like xuliu%’;
6、应尽量避免在 where 子句中对字段进行表达式操作
如:
select id from t where num/2 = 100
应改为:
select id from t where num = 100*2;
7、应尽量避免在 where 子句中对字段进行函数操作
例如:
select id from t where substring(name,1,3) = ‘abc’;
以abc开头的,应改成:
select id from t where name like ‘abc%’
8、不要在 where 子句中的 “=” 左边进行函数、算术运算或其他表达式运算
9、如果MySQL估计使用全表扫描要比使用索引快,则不使用索引;
10、不适合键值较少的列(重复数据较多的列)

最左前缀原则
最左前缀原则:顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上。
(1)如果第一个字段是范围查询需要单独建一个索引;
(2)在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边;
当创建(a,b,c)复合索引时,想要索引生效的话,只能使用 a和ab、ac和abc三种组合!

实例:以下是常见的几个查询:

mysql>SELECT a,b,c FROM A WHERE a=‘a1’ ; //索引生效
mysql>SELECT a,b,c FROM A WHERE b=‘b2’ AND c=‘c2’; //索引失效
mysql>SELECT a,b,c FROM A WHERE a=‘a3’ AND c=‘c3’; //索引生效,实际上值使用了索引a
扩展:想要索引最大化的使用需要至少建几个索引?

答:需要建立复合索引:bc

综上所述:在where里使用不等号、or、前置模糊查询、多列组合索引,不是使用的第一部分都会导致索引失效
列类型是字符串,where中数据没使用引号引用起来;
where 子句中对字段进行表达式操作、函数操作、算术运算都会使索引失效

in 和 not in 也要慎用,否则将会导致全表扫描(not in和<>all 对空值敏感,一旦有空值出现整个sql执行结果就为空)。in 对于连续的数组,可以使用between …and.来代替。
并且Oracle中in也是有限制的,好像是超过1000就会报错
很多时候用exists 代替 in是一个很好的选择。
比如:
select num from user where num in(select num from newTable);
可以使用下面语句代替:
select num from user a where exists(select num from newTable b where b.num = a.num );

当优化器(Oracle有基于规则的优化器RBO、基于成本的优化器CBO)通过执行计划,
认为全表扫描最优,则不使用索引,并不是所有的都适合建索引,重复数据列多的时候
并不适合建索引,表更新很频繁,创建索引也会导致资源消耗大,数据量大的时候要慎重
(索引固然可以提高相应的查询效率,但是同样会降低insert以及update的效率。
因为在insert或是update的时候有可能会重建索引或是修改索引。所以索引怎样创建需要慎重考虑,视情况而定。)一个表中所以数量最好不要超过6个。
若太多,则需要考虑一些不常用的列上创建索引是否有必要。
当然索引会加快查询,创建索引时,首先应该考虑在where和order by
涉及的列上创建索引

三查看执行计划
嵌套循环连接(nested loops):(驱动表外层循环,被驱动表内层循环,当驱动表结果集少,而此时被驱动表有唯一索引,那么效率就会非常高,驱动表记录数很多,用这种连接效率不高)
可以实现快速响应,即他可以第一时间先返回已经连接过且满足连接条件的记录。而不用等待所有的连接操作全部做完后才返回连接结果
哈希连接(hash join):只适用于等值连接(效率远高于sort merge join),用于大表和小表关联记录数很多的时候
排序合并连接(sort merge join):一种两个表在做表连接的时候使用排序操作和合并操作来做连接得到结果集的连接方法
适用范围广,适合(<、<=、>、>=)
常用查看执行计划方式:
1)explain plan命令
2)DBMS_XPLAN包
3)AUTOTRACE开关
4)10046事件
5)10053事件
6)AWR SQL报告
sql优化总结_第1张图片
具体参考
查看执行计划:http://blog.itpub.net/30557618/viewspace-1833425/
索引失效的条件:https://blog.csdn.net/xlgen157387/article/details/79572598
部分内容来自以上地址博客,本人纯属总结了一下

看过一段话:sql优化最有技术含量的部分不在于通过种种手段(比如重新收集统计信息等)调整目标sql的执行计划,缩短其执行时间,解决该sql的性能问题,而在于要知道CBO为什么在一开始会选错执行计划,要知道CBO选错执行计划的根本原因

你可能感兴趣的:(oracle,数据库,mysql,sql)