快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和记娱h188下载app手机版:提高mysql性能的方法



一、问题的提出

在利用系统开拓初期,因为开拓数据库数据对照少,对付查询SQL语句,繁杂视图的的编写等体会不出SQL语句各类写法的机能好坏,然则假如将和记娱h188下载app手机版利用系统提交实际利用后,跟着数据库中数据的增添,系统的相应速率就成为今朝系统必要办理的最主要的问题之一。系统优化中一个很紧张的方面便是SQL语句的优化。对付海量数据,劣质SQL语句和优质SQL语句之间的速率区别可以达到上百倍,可见对付一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,前进系统的可用性。

在多半环境下,Oracle应用索引来更快地遍历表,优化器主要根据定义的索引来前进机能。然则,假如在SQL语句的where子句中写的SQL代码分歧理,就会造成优化器删去索引而应用全表扫描,一样平常就这种SQL语句便是所谓的劣质SQL语句。在编写SQL语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出高机能的SQL语句。

二、SQL语句编写留意问题

下面就某些SQL语句的where子句编写中必要留意的问题作具体先容。在这些where子句中,纵然某些列存在索引,然则因为编写了劣质的SQL,系统在运行该SQL语句时也不能应用该索引,而同样应用全表扫描,这就造成了相应速率的极大年夜低落。

1. IS NULL 与 IS NOT NULL

不能用null作索引,任何包孕null值的列都将不会被包孕在索引中。纵然索引有多列这样的环境下,只要这些列中有一列含有null,该列就会从索引中扫除。也便是说假如某列存在空值,纵然对该列建索引也不会前进机能。

任何在where子句中应用is null或is not null的语句优化器是不容许应用索引的。

2. 联接列

对付有联接的列,纵然着末的联接值为一个静态值,优化器是不和记娱h188下载app手机版会应用索引的。我们一路来看一个例子,假定有一个职工表(employee),对付一个职工的姓和名分成两列寄放(FIRST_NAME和LAST_NAME),现在要查询一个叫比尔.克林顿(Bill Cliton)的职工。

下面是一个采纳联接查询的SQL语句,

select * from employss

where

first_name||''||last_name ='Beill Cliton'

上面这条语句完全可以查询出是否有Bill Cliton这个员工,然则这里必要留意,系统优化器对基于last_name创建的索引没有应用。

当采纳下面这种S和记娱h188下载app手机版QL语句的编写,Oracle系统就可以采纳基于last_name创建的索引。

Select * from employee where first_name ='Beill' and last_name ='Cliton'

碰到下面这种环境又若何处置惩罚呢?假如一个变量(name)中寄放着Bill Cliton这个员工的姓名,对付这种环境我们又若何避免全程遍历,应用索引呢?可以应用一个函数,将变量name中的姓和名分开就可以了,然则有一点必要留意,这个函数是不能感化在索引列上。下面是SQL查询脚本:

select * from employee where first_name = SUBSTR('&&name',1,INSTR('&&name',' ')-1) and last_name = SUBSTR('&&name',INSTR('&&和记娱h188下载app手机版name’,' ')+1)

3. 带通配符(%)的和记娱h188下载app手机版like语句

同样以上面的例子来看这种环境。今朝的需求是这样的,要求在职工表中查询名字中包孕cliton的人。可以采纳如下的查询SQL语句:

select * from employee where last_name like '%cliton%'

这里因为通配符(%)在征采词首呈现,以是Oracle系统不应用last_name的索引。在很多环境下可能无法避免这种环境,然则必然要心中有底,通配符如斯应用会低落查询速率。然而当通配符呈现在字符串其他位置时,优化器就能使用索引。鄙人面的查询中索引获得了应用:

select * from employee where last_name like 'c%'

4. Order by语句

ORDER BY语句抉择了Oracle若何将返回的查询结果排序。Order by语句对要排序的列没有什么特其余限定,也可以将函数加入列中(象联接或者附加等)。任何在Order by语句的非索引项或者有谋略表达式都将低落查询速率。

仔细反省order by语句以找出非索引项或者表达式,它们会低落机能。办理这个问题的法子便是重写order by语句以应用索引,也可以为所应用的列建立别的一个索引,同时应绝对避免在order by子句中应用表达式。

5. NOT

我们在查询时常常在where子句应用一些逻辑表达式,如大年夜于、小于、即因此及不即是等等,也可以应用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。下面是一个NOT子句的例子:

... where not (status ='VALID')

假如要应用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符。NOT运算符包孕在别的一个逻辑运算符中,这便是不即是('INVALID'

再看下面这个例子:

select * from employee where salary3000;

虽然这两种查询的结果一样,然则第二种查询规划会比第一种查询规划更快些。第二种查询容许Oracle对salary列应用索引,而第一种查询则不能应用索引。

6. IN和EXISTS

无意偶尔候会将一列和一系列值相对照。最简单的法子便是在where子句中应用子查询。在where子句中可以应用两种款式的子查询。

第一种款式是应用IN操作符:

... where column in(select * from ... where ...);

第二种款式是应用EXIST操作符:

... where exists (select 'X' from ...where ...);

我信托绝大年夜多半人会应用第一种款式,由于它对照轻易编写,而实际上第二种款式要远比第一种款式的效率高。在Oracle中可以险些将所有的IN操作符子查询改写为应用EXISTS的子查询。

第二种款式中,子查询以‘select 'X'开始。运用EXISTS子句不管子查询从表中抽取什么数据它只查看where子句。这样优化器就不必遍历全部表而仅根据索引就可完成事情(这里假定在where语句中应用的列存在索引)。相对付IN子句来说,EXISTS应用相连子查询,构造起来要比IN子查询艰苦一些。

经由过程应用EXIST,Oracle系统会首先反省主查询,然后运行子查询直到它找到第一个匹配项,这就节省了光阴。Oracle系统在履行IN子查询时,首先履行子查询,并将得到的结果列表寄放在在一个加了索引的临时表中。在履行子查询之前,系统先将主查询挂起,待子查询履行完毕,寄放在临时表中今后再履行主查询。这也便是应用EXISTS比应用IN平日查询速率快的缘故原由。

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

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: