- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章常用SQL语句优化技巧总结【经典】由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例总结了常用SQL语句优化技巧。分享给大家供大家参考,具体如下:
除了建立索引之外,保持良好的SQL语句编写习惯将会降低SQL性能问题发生.
①通过变量的方式来设置参数 。
好:
1
|
stringsql =
"select * from people p where p.id = ? "
;
|
坏:
1
|
stringsql =
"select * from people p where p.id = "
+id;
|
数据库的SQL文解析和执行计划会保存在缓存中,但是SQL文只要有变化,就得重新解析.
“…where p.id = ”+id的方式在id值发生改变时需要重新解析,这会耗费时间.
②不要使用select * 。
好:
1
|
stringsql =
"select people_name,pepole_age from people "
;
|
坏:
1
|
stringsql =
"select * from people "
;
|
使用select *的话会增加解析的时间,另外会把不需要的数据也给查询出来,数据传输也是耗费时间的, 。
比如text类型的字段通常用来保存一些内容比较繁杂的东西,如果使用select *则会把该字段也查询出来.
③谨慎使用模糊查询 。
好:
1
|
stringsql =
"select * from people p where p.id like 'parm1%' "
;
|
坏:
1
|
stringsql =
"select * from people p where p.id like '%parm1%' "
;
|
当模糊匹配以%开头时,该列索引将失效,若不以%开头,该列索引有效.
④不要使用列号 。
好:
1
|
stringsql =
"select people_name,pepole_age from people order by name,age"
;
|
坏:
1
|
stringsql =
"select people_name,pepole_age from people order by 6,8"
;
|
使用列号的话,将会增加不必要的解析时间.
⑤优先使用UNION ALL,避免使用UNION 。
好:
1
|
stringsql =
"select name from student union all select name from teacher"
;
|
坏:
1
|
stringsql =
"select name from student union select name from teacher"
;
|
UNION 因为会将各查询子集的记录做比较,故比起UNION ALL ,通常速度都会慢上许多。一般来说,如果使用UNION ALL能满足要求的话,务必使用UNION ALL。还有一种情况,如果业务上能够确保不会出现重复记录.
⑥在where语句或者order by语句中避免对索引字段进行计算操作 。
好:
1
|
stringsql =
"select people_name,pepole_age from people where create_date=date1 "
;
|
坏:
1
|
stringsql =
"select people_name,pepole_age from people where trunc(create_date)=date1"
;
|
当在索引列上进行操作之后,索引将会失效。正确做法应该是将值计算好再传入进来.
⑦使用not exist代替not in 。
好:
1
|
stringsql =
"select * from orders where customer_name not exist (select customer_name from customer)"
;
|
坏:
1
|
stringsql =
"select * from orders where customer_name not in(select customer_name from customer)"
;
|
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引.
⑧ exist和in的区别 。
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。因此,in用到的是外表的索引, exists用到的是内表的索引.
如果查询的两个表大小相当,那么用in和exists差别不大.
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表) 。
1:
1
|
select
*
from
A
where
cc
in
(
select
cc
from
B)
|
效率低,用到了A表上cc列的索引; 。
1
|
select
*
from
A
where
exists(
select
cc
from
B
where
cc=A.cc)
|
效率高,用到了B表上cc列的索引.
2:
1
|
select
*
from
B
where
cc
in
(
select
cc
from
A)
|
效率高,用到了B表上cc列的索引; 。
1
|
select
*
from
B
where
exists(
select
cc
from
A
where
cc=B.cc)
|
效率低,用到了A表上cc列的索引.
⑨避免在索引列上做如下操作:
◆避免在索引字段上使用<>,!= ◆避免在索引列上使用IS NULL和IS NOT NULL ◆避免在索引列上出现数据类型转换(比如某字段是String类型,参数传入时是int类型) 。
当在索引列上使用如上操作时,索引将会失效,造成全表扫描.
⑩复杂操作可以考虑适当拆成几步 。
有时候会有通过一个SQL语句来实现复杂业务的例子出现,为了实现复杂的业务,嵌套多级子查询。造成SQL性能问题。对于这种情况可以考虑拆分SQL,通过多个SQL语句实现,或者把部分程序能完成的工作交给程序完成.
希望本文所述对大家数据库程序设计有所帮助.
最后此篇关于常用SQL语句优化技巧总结【经典】的文章就讲到这里了,如果你想了解更多关于常用SQL语句优化技巧总结【经典】的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
本文主要给大家介绍Mysql数据库分库和分表方式(常用),涉及到mysql数据库相关知识,对mysql数据库分库分表相关知识感兴趣的朋友一起学习吧 1 分库 1.1 按照功能分库 按照功能进行
在当前对象由其他包含对象操作的系统中,当传递对当前对象的引用时,链接似乎一直在继续......没有任何结束(对于下面的代码,Car ->myCurrentComponent->myCar_Brake-
我有一个密码 UIAlertView,我们要求用户提供。我需要根据情况在不同的 View 上询问它,从 downloadViewController (用户下载数据后),当他们切换到他们的数据时(如果
我正在尝试编写一个函数,使得对于任何整数 x 的 P(x) 都有一个包含三个元素的列表,即平方、立方和 n 的四次方,但我仍然不知道如何组合然后制作一个函数,例如我有平方、立方体和 4 次幂函数下面是
关闭。这个问题需要更多 focused .它目前不接受答案。 关闭4年前。 锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或交互。 我能否列出一份常见的
Python 常用 PEP8 编码规范 代码布局 缩进 每级缩进用4个空格。 括号中使用垂直隐式缩进或使用悬挂缩进。 EXAMPLE: ?
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 去年关闭。 Improve this questio
在经典 ui 中,您可以使用 xtype:cqinclude 包含来自不同路径的 rtePlugins,基本上为标准 RTE 插件创建一个位置,我如何在 Touch UI 中执行相同操作? 我尝试使用
在经典 ui 中,您可以使用 xtype:cqinclude 包含来自不同路径的 rtePlugins,基本上为标准 RTE 插件创建一个位置,我如何在 Touch UI 中执行相同操作? 我尝试使用
*strong text*我有多个网络应用程序使用了一些常见的依赖项,比如蒙戈连接器谷歌 Guava 乔达时间 我想到将它们从 webapp/WEB-INF/lib 中取出并放入一些 common-l
我正在编写一个 Web 服务器,我想知道哪些 HTTP 请求 header (由客户端发送)是最常见的,因此我应该重点实现。 目前,我只支持Accept 和Host。 最佳答案 不确定您的范围,但由于
我是一名优秀的程序员,十分优秀!