数据库性能优化-SQL优化 mysql oracle

数据库性能优化-SQL优化

mysql或者oracle性能优化;oracle 或者 mysql 没有创建索引之前,1万多条数据,直接查询可能都会出现慢的问题。


  1. where条件中,过滤量最大的条件放在where子句最后
  2. 在索引列上使用计算、函数、改变索引列的类型、索引列存在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
	```
  1. 尽量避免where中包含子查询;
  2. 采用绑定变量有助于提高效率;
  3. .运算符效率:exists高于in高于or,(not exists高于not in);
    (这里指出:in和or都是效率较低的运算;用(UNION)UNION ALL 替换 OR (适用于索引列))
  4. 避免在索引列上使用is null和is not null;
  5. 使用索引的第一个列;
  6. 用union-all替代union; (原因:UNION ALL,不去重复、不排序; UNION 自动删除重复项、要排序 因此慢)
  7. -建议用 exists 替换 in,建议用 not exists 替换 not in; in 比较慢; or in 更慢的;
  8. like ‘text%’使用索引,但like ‘%text’不使用索引; 只能用:字符串% ;改成COUNT(1)
  9. select a, b from tab比select * from tab效率高。
  10. oracle 索引的分类,常规索引 B-tree、位图索引Bitmap(适合男女、年龄这种重复性的,只有0和1存储所以比较合适)、反转索引reverse
  11. 使用>=代替>, 因为>要查找两次,>=只要查找一次。
  12. 排序:尽量使用索引列来排序,因为索引是提前排好序的.
  13. 销量排行榜:在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?
  14. 是用oracle SQL Tuning advisor 范例 SQL代码范例
  15. 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

发布了112 篇原创文章 · 获赞 85 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/ab601026460/article/details/84198365