如何正确编写高质量高性能的MySQL语法(2)

作者:xiaoqiao 来源:赛迪网技术社区 时间:2008-11-27 15:43:00 

4. Order by语句

ORDER BY语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。

仔细检查order by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order by子句中使用表达式。

5.NOT

我们在查询时经常在where子句使用一些逻辑表达式,如大于、小于、等于以及不等于等等,也可以使用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。

如果要使用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符。NOT运算符包含在另外一个逻辑运算符中,这就是不等于(<>)运算符。换句话说,即使不在查询where子句中显式的加入NOT词,NOT仍在运算符中。

对这个查询,可以改写为不使用NOT:

虽然这两种查询之结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。

6. IN和EXISTS

有时候会将一列和一系列值相比较。最简单的办法就是在where子句中使用子查询。在where子句中可以使用两种格式的子查询。

第一种格式是使用IN操作符;第二种格式是使用EXIST操作符。

我相信绝大多数人会使用第一种格式,因为它比较容易编写,而实际上第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询。

第二种格式中,子查询以&lsquo;select 'X'开始。运用EXISTS子句不管子查询从表中抽取什么数据它只查看where子句。这样优化器就不必遍历整个表而仅根据索引就可完成工作(这里假定在where语句中使用的列存在索引)。相对于IN子句来说,EXISTS使用相连子查询,构造起来要比IN子查询困难一些。

通过使用EXIST,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。

同时应尽可能使用NOT EXISTS来代替NOT IN,尽管二者都使用了NOT(不能使用索引而降低速度),NOT EXISTS要比NOT IN查询效率更高。

标签:
0
投稿

猜你喜欢

  • 使用Python实现将list中的每一项的首字母大写

    2023-01-07 15:05:04
  • node.js微信公众平台开发教程

    2024-05-03 15:56:19
  • SQL Server转换为XQuery及反向转换

    2009-01-20 13:32:00
  • .Net行为型设计模式之观察者模式(Observer)

    2024-05-13 09:17:50
  • 架构师说比起404我们更怕200错误

    2022-11-02 20:40:43
  • MySQL 查看链接及杀掉异常链接的方法

    2024-01-27 00:29:40
  • python BlockingScheduler定时任务及其他方式的实现

    2022-02-13 17:32:25
  • python基于itchat实现微信群消息同步机器人

    2023-08-02 03:23:51
  • SpringBoot+Mybatis-Plus实现mysql读写分离方案的示例代码

    2024-01-17 02:13:32
  • MySQL实现replace函数的几种实用场景

    2024-01-24 20:32:23
  • MySQL乱码问题深层分析

    2009-03-09 14:53:00
  • Python参数类型以及常见的坑详解

    2023-04-16 13:52:33
  • PHP在网页中动态生成PDF文件详细教程

    2024-05-08 09:34:56
  • SQL SERVER如何判断某个字段包含大写字母

    2023-07-01 21:19:12
  • python字符串下标与切片及使用方法

    2022-04-21 13:08:03
  • 一文带你安装opencv与常用库(保姆级教程)

    2021-03-11 12:21:19
  • jquery常用的表单操作很全很详细

    2011-09-01 19:21:11
  • 删除数组中重复项(uniq)

    2009-12-28 12:23:00
  • Mysql使用kill命令解决死锁问题(杀死某条正在执行的sql语句)

    2024-01-24 06:36:03
  • python实现简单登陆系统

    2023-05-25 06:50:49
  • asp之家 网络编程 m.aspxhome.com