总结

今天早上考试,下午主要是老师引导我们学习SQL优化,晚上主要是同学的技术分享,杨松柏同学主要给我们分享了java的io的一些东西,c10k问题,bio(同步阻塞IO),NIO(同步非阻塞IO),netty,对于NIO的进一步封装,主要因为NIO用起来很麻烦。邵闫利主要给我们讲解了java基础,特别强调设计模式的应用,工厂模式,观察者模式,装饰器模式三者,给我们通俗易懂的讲解虽然我还是不太懂,下来自己去看一下设计模式,后面的同学都给我们讲解了一些新的知识,git rebase,k8s子类的东西,收获良多。

杂项

用in和exists替换distinct

能用union不要用union all

驱动表

wwh999 在 2006年总结说,当进行多表连接查询时, [驱动表] 的定义为:

  1. 指定了联接条件时,满足查询条件的记录行数少的表为[驱动表];
  2. 未指定联接条件时,行数少的表为[驱动表](Important!)。

优化

  1. LEFT JOIN改为JOIN
  2. 除所有JOIN,让MySQL自行决定

连表查询之驱动表

基于案例学习的sql优化

从案例中推导SQL优化的总体思路与误区

count(*) count(列)

无索引:count(*) count(列)一样

有索引:列非空(count() count(列)一样) (列可空)count() count(列)不一样

但是count(*)与 count(列)不等价

count(*):会统计null列,count(列)不会计算Null列

count()速度最快,列的偏移量决定性能,列越靠后,访问开销越大,count()与列无关,所以count(*)速度最快,count(最后列)速度最慢

sql书写顺序

表的连接顺序

大表在前,小表在后是基于规则的时代(select /*+rule*/ count(*) from tab_big,tab.small),现在是基于代价的时代,两种写法一样的。

表的条件顺序

过滤条件越多,越放在后面-> 错

not in,not exists

anti反连接算法比filter高效,10g中,oracle指定非空,not in才用anti算法.11g中not in 和not exists一样,无论是否非空,都走anti算法。

设计

全局临时表

delete删除开销大,占用大量回滚段和产生大量日志。

CREATE GLOBAL TEMPORARY TABLE temp_table_session (...) ON COMMIT (PRESERVE|DELETE) ROWS

session全局临时表:退出session记录清空

基于事务全局临时表:commit表记录清空

分区表

create table range_part_tab (id number,deal_date date,area_code number,contents varchar2(4000))
partition by range (deal_date)
(
partition p1 values less than (TO_DATE('2012-02-01', 'YYYY-MM-DD')),
...
partition p_max values less than (maxvalue)
)
;

oracle的 分表 详解 -----表分区

历史数据管理

开发

避免SQL中函数调用

用表连接代替函数调用

用集合写法

只取所需列

  1. 访问视图变快,可以避免访问更多表
  2. 可以通过索引得到列,无需回表
  3. 表连接变快,避免连接更多的表

超长SQL优化

  • case when相同代码封装
  • group by简化case when(部分适用)

根据场景选择技术

索引坏处

  1. 先插入数据,再创建索引。
  2. 在有索引时插入数据很慢,需要保持数据有序
  3. 分成两个库(一个生产库,很少索引)(一个查询库,很多索引)

分区慢:分区不加where会使性能变慢

位图索引:位图索引适合只有几个固定值的列,如性别、婚姻状况、行政区等等,而身份证号这种类型不适合用位图索引。

等价改写

-- 不等价 一份复制,两份粘贴
insert all into ljb_tmp_transaction into ljb_tmp_session select * from dba_objects
-- 不等价,同一时刻记录不一样
insert into ljb_tmp_transaction as select * from dba_objects;
insert into jb_tmp_session as select * from dba_objects; -- 没有办法同时扫描叶子,性能比第二条差,但是不等价
select min(object_id),max(object_id) from t;
-- 不是同一时刻
select max(object_id) from t;
select min(object_id) from t;
-- a,b同时一条,索引不会有笛卡尔积 和第一条等价,性能好
select max, min
from (select max(object_id) max from t ) a,
(select min(object_id) min from t ) b;

in性能好于>,<

需求是顶级优化

BIO,NIO,AIO的区别

最新文章

  1. geotrellis使用(二十八)栅格数据色彩渲染(多波段真彩色)
  2. vector删除元素浅析
  3. 《深入理解Nginx》阅读与实践(二):配置项的使用
  4. latex figure \label 放在\caption 后
  5. Bridge桥接模式
  6. SpriteParticle II
  7. bnuoj 29368 Check the Identity(栈)
  8. AIX加入能telnet远程连接方法的帐户
  9. Effective C++ 读书总结
  10. C#入门经典第九章定义类-1
  11. canvas 从初级到XX 1# 部分非基础原生API的使用 [初级向]
  12. django反向解析传参
  13. 查看CentOS版本信息
  14. python 中的 print 函数与 list函数
  15. 常用的jquerymobil 站点
  16. 使用FFMPEG类库分离出多媒体文件中的H.264码流
  17. python---django初步了解以及安装(包括Django网页首次无法访问的原因及解决方法,以及在linux服务器上布置无法启动的原因)
  18. android 桌面小工具(Widget)开发教程
  19. ExtJS使用入门
  20. 带你从零学ReactNative开发跨平台App开发(十一)

热门文章

  1. hive启动时 Terminal initialization failed; falling back to unsupported java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected
  2. IDEA 加载Eclipse项目
  3. 9 python 数据类型—字典
  4. KVM-快照管理
  5. BEC listen and translation exercise 43
  6. utc时间、本地时间及时间戳转化
  7. Android中的优化技巧
  8. FFMPEG实现的转码程序
  9. Linux下eclipse及mysql安装,c++访问mysql数据库
  10. [转]nodejs中的process模块--child_process.exec