【关注茅哥】分享技术,分享科技,如果觉得还可以别忘了关注茅哥、点个赞哦!若还有什么不明白的地方请评论区下方留言,若想了解更多相关知识,请关注茅哥,会持续更新内容,谢谢支持!
今天带来了SQL的第二弹了,讲讲实际运用过程中常见的一些优化措施,希望能对大家有所帮助,不对的地方也欢迎大家指正和留言探讨。
查询SQL的机制
每条查询SQL提交到数据库时,数据库内核必须为每个查询指定查询的策略:首先执行器会先根据提交的SQL得出各种执行计划,然后优化器会根据当前数据的CPU、内存、I/O交互等资源情况,选择最优的执行计划。
优化方法一:基础表的选择
什么是基础表:被最先访问的表(通常以全表扫描的方式被访问)。
在From 中涉及多个表查询时,会先扫描基础(From语句最后面的那个表),并对记录进行排序,接着扫描倒数第二个表,最后会将倒数第二个表检索出来的记录与基础表的匹配的记录进行合并;
现有A表 10000 条记录 、 B表 1 条记录 (如下为Oracle测试标准)
select ... from A,B;执行时间 0.84s
select ... from B,A; 执行时间24.46s
那么疑问来了,涉及3个及以上的表进行关联时,如何选择基础表呢?将交叉表作为基础表。
交叉表:被其他表引用的表。
现有 C 表 的id、name字段与A、B两表有交集,如下选择基础表最优:
select ... from A,B,C where C.id=A.id and C.name=B.name;
优化方法之二:明确where的执行顺序
我们知道Oracle采用的是自上而下、自右向左的解析顺序的!所以尽量在能过滤掉大部分数据的条件放到where的最后面。
select ... from A where (select ... from A where age > 10) and A.name like '%maoge' and A.id='5564';
优化方法之三:使用表别名
使用表别名不一定是什么好的优化方法,但一定是个好的习惯。将需要查询的列名带上别名,既能方便自己看脚本,也可以减少解析的时间。可以最大化的减少那些由列歧义引起的语法错误。
优化方法之三:count的合理使用
有索引当然是count(索引列),这个是最快的;
数据表没有主键,那么count(1)要比count(*)快;
有主键(联合主键)的话,那么count(1)要比count(*)快;
如果数据表只有1个字段,那么count(*)要比count(1)快;
别做梦啦,生产环境基本没有1个字段的表啦,所以你乖乖使用count(1)吧!
优化方法之四:不要使用 *
在查询时真的不是要使用 * ,即使是你要获取所有的字段,这是一种习惯,很多想华为这样的公司都写进了代码审查规范中去了。
虽然都知道很方便,用起来很爽,但是真的一个非常低效的方法,特别是你所要的结果只是几百个字段里面的十几二十个的时候。在实际的解析过程中,会将 * 替换成所有的列名。
优化方法之五:使用where代替having子句
having会在where的后面执行,即需要在检索出所有的记录结果后(即select后)再进行对结果集进行过滤。
select ... from A where age > 25 and id 优化方法之六:Exists 和 IN的正确使用
详细见我的上一篇文章 “史上最详细的 exists 和 in 讲解 ”
优化方法之七:使用表连接代替 exists
select name from A where exists (select 1 from B where B.name=A.name); 效率低select name from A join B on A.name=B.name;效率高
优化方法之八:索引列的注意点
1、避免在索引列上进行计算;(在索引列上进行计算,将进行全表的扫描分析)
2、避免在索引列上使用not,同1
3、避免在索引列上使用is null 和 is not null
4、避免改变索引列的类型。
记得关注一波茅哥再走哦!动动你的小手指分享给你的朋友们,自己也记得收藏一波以备不时之需!
领取专属 10元无门槛券
私享最新 技术干货