数据库性能优化-SQL优化
mysql或者oracle性能优化;oracle 或者 mysql 没有创建索引之前,1万多条数据,直接查询可能都会出现慢的问题。
- where条件中,过滤量最大的条件放在where子句最后
- 在索引列上使用计算、函数、改变索引列的类型、索引列存在null、在索引列上使用not(!=、<>)将放弃索引;
索引列不能存在null,否则索引会失效;
索引应该建立在 不同取值多的字段,如订单号码;男女 这种重复值多的就不能建常规
索引;
CREATE BITMAP INDEX INDEX_ORDER_ORDER_TYPE ON T_ORD_ORDER(ORDER_TYPE DESC );-- 这的bitmap 索引专门针对男女、年龄、类型这种重复性的索引
索引能查快搜索速度,经常使用的字段上用;否则会从全表扫描
like ‘%text%’不会走索引
3. 不要以字符格式声明数字,要以数字格式声明字符值。(日期同样)
否则会使索引无效,产生全表扫描。
```sql
SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369;
不要使用:SELECT emp.ename, emp.job FROM emp WHERE emp.empno = ‘7369
```
- 尽量避免where中包含子查询;
- 采用绑定变量有助于提高效率;
- .运算符效率:exists高于in高于or,(not exists高于not in);
(这里指出:in和or都是效率较低的运算;用(UNION)UNION ALL 替换 OR (适用于索引列)) - 避免在索引列上使用is null和is not null;
- 使用索引的第一个列;
- 用union-all替代union; (原因:UNION ALL,不去重复、不排序; UNION 自动删除重复项、要排序 因此慢)
- -建议用 exists 替换 in,建议用 not exists 替换 not in; in 比较慢; or in 更慢的;
- like ‘text%’使用索引,但like ‘%text’不使用索引; 只能用:字符串% ;改成COUNT(1)
- select a, b from tab比select * from tab效率高。
- oracle 索引的分类,常规索引 B-tree、位图索引Bitmap(适合男女、年龄这种重复性的,只有0和1存储所以比较合适)、反转索引reverse
- 使用>=代替>, 因为>要查找两次,>=只要查找一次。
- 排序:尽量使用索引列来排序,因为索引是提前排好序的.
- 销量排行榜:在oracle中效率排行:表连接>exist>not exist>in>not in;
因此如果简单提高效率可以用exist代替in进行操作,当然换成表连接可以更快地提高效率,具体是用left join代替not in 和not exist,用inner join 代替in和exist,这样可以大大提高效率
在 oracle 里面 in() 里面最多只能有1000个表达式,超过了就会报错,不要使用or in, 这种方式 比 for 循环都要慢的
下面列出一个使用exist 替代 in 超过1000的解决方案:
-- 一个使用 EXISTS 替代 IN 超过1000的解决方案:
SELECT * FROM T_ORD_ORDER WHERE DISPATCH_UPSTREAM_ID IN ('WESDU20180906018651','WESDU20180906018650','WESDU20180906018653');
--下面是改写的方案:
SELECT * FROM T_ORD_ORDER where EXISTS ( SELECT 1 FROM ( SELECT 'WESDU20180906018651' A FROM DUAL UNION ALL SELECT 'WESDU20180906018650' A FROM DUAL UNION ALL SELECT 'WESDU20180906018653' A FROM DUAL ) WHERE T_ORD_ORDER.DISPATCH_UPSTREAM_ID = A );
详细可以查看链接:SQL 怎么用EXISTS替代IN? - 是用oracle SQL Tuning advisor 范例 SQL代码范例
- IN 使用的谨记,oracle In 最大只能是1000个; mysql不限制,但是限制了sql整体最大是4MB.
Oracle数据库查询优化方案(处理上百万级记录如何提高处理查询速度)
mysql查询优化1
mysql查询优化2
MySQL索引原理以及查询优化?
mysql百万级数据量根据索引优化查询速度
Oracle 索引的分类
oracle优化建议-推荐必读
使用ORACLE SQL Tuning advisor快速优化低效的SQL语句
mysql 风哥课程 MySQL性能分析与优化调整_MySQL数据库性能优化与运维诊断04