資料庫優化以及常用的語句

2022-03-10 21:15:52 字數 3196 閱讀 9755

(部分摘自

1、ddl和dml

dml:資料操縱語言:比如insert,delete,update 

dql:資料查詢語言:select 查詢語句不存在提交問題

ddl:資料定義語言:如create,alter和drop 

2、oracle 分頁

select c.* from (

select a.*, row_number() over (order by a.id) idx from table a where 1=1 order by a.id

)  c where c.idx > (pagenum-1) * pagesize and c.idx <= pagenum * pagesize

3 、mysql 分頁

資料量小時:select * from table limit (pagenum-1) ,pagesize

資料量大時:1、主鍵建立索索引 2、select * from table where id>(pagenum-1) * pagesize order by id  limit pagesize

4、 索引 

1、索引應該經常建在where 子句經常用到的列上

2、對於聯表查詢的字段,應該建立索引。

3、如果經常在某錶的乙個字段進行order by 則也經過進行索引。

4、不在小表上建設索引。

5、索引可以提高查詢速度,但是dml語句會更新索引,造成dml語句執行變慢

6、建立索引:create index indexname on table(columnname1,columnname2,。。。。。)

7、如果在where 子句中有or 操作符或單獨引用job 列(索引列的後面列) 則將不會走索引,將會進行全表掃瞄。

5、oeacle的sql 優化:

當oracle資料庫拿到sql語句時,其會根據查詢優化器分析該語句,並根據分析結果生成查詢執行計畫。

也就是說,資料庫是執行的查詢計畫,而不是sql語句。

查詢優化器有rule-based-optimizer(基於規則的查詢優化器) 和cost-based-optimizer(基於成本的查詢優化器)。

其中基於規則的查詢優化器在10g版本中消失。

對於規則查詢,其最後查詢的是全表掃瞄。而cbo則會根據統計資訊進行最後的選擇。

1、先執行from ->where ->group by->order by

2、執行from 字句是從右往左進行執行。因此必須選擇記錄條數最少的表放在右邊。這是為什麼呢?  

3、對於where字句其執行順序是從後向前執行、因此可以過濾最大數量記錄的條件必須寫在where子句的末尾,而對於多表之間的連線,則寫在之前。

因為這樣進行連線時,可以去掉大多不重複的項。  

4. select子句中避免使用(*)oracle在解析的過程中, 會將』*』 依次轉換成所有的列名, 這個工作是通過查詢資料字典完成的, 這意味著將耗費更多的時間

5、索引失效的情況:

① not null/null 如果某列建立索引,當進行select * from emp where depto is not null/is null。 則會是索引失效。

② 索引列上不要使用函式,select col from tbl where substr(name ,1 ,3 ) = 'abc' 

或者select col from tbl where name like '%abc%' 而select col from tbl where name like 'abc%' 會使用索引。

③ 索引列上不能進行計算select col from tbl where col / 10 > 10 則會使索引失效,應該改成

select col from tbl where col > 10 * 10

④ 索引列上不要使用not ( != 、 <> )如:select col from tbl where col ! = 10 

應該 改成:select col from tbl where col > 10 or col < 10 。

6、用union替換or(適用於索引列)

union:是將兩個查詢的結果集進行追加在一起,它不會引起列的變化。 由於是追加操作,需要兩個結果集的列數應該是相關的,

並且相應列的資料型別也應該相當的。union 返回兩個結果集,同時將兩個結果集重複的項進行消除。 如果不進行消除,用unoin all.

通常情況下, 用union替換where子句中的or將會起到較好的效果. 對索引列使用or將造成全表掃瞄. 注意, 以上規則只針對多個索引列有效. 

如果有column沒有被索引, 查詢效率可能會因為你沒有選擇or而降低. 在下面的例子中, loc_id 和region上都建有索引.

高效:select loc_id , loc_desc , region

from location

where loc_id = 10

union

select loc_id , loc_desc , region

from location

where region = 「melbourne」

低效:select loc_id , loc_desc , region

from location

where loc_id = 10 or region = 「melbourne」

如果你堅持要用or, 那就需要返回記錄最少的索引列寫在最前面.

7. 用exists替代in、用not exists替代not in

在許多基於基礎表的查詢中, 為了滿足乙個條件, 往往需要對另乙個表進行聯接. 在這種情況下, 使用exists(或not exists)通常將提高查詢的效率. 

在子查詢中, not in子句將執行乙個內部的排序和合併. 無論在哪種情況下, not in都是最低效的(因為它對子查詢中的表執行了乙個全表遍歷). 

為了避免使用not in, 我們可以把它改寫成外連線(outer joins)或not exists.

例子:高效: select * from emp (基礎表) where empno > 0 and exists (select 『x』 from dept where dept.deptno = emp.deptno and loc = 『melb』)

低效: select * from emp (基礎表) where empno > 0 and deptno in(select deptno from dept where loc = 『melb』)

MySQL資料庫查詢語句的常用優化

mysql將in中的常量全部儲存在乙個陣列裡面,而且這個陣列是排好序的。如果數值過多,對引擎查詢過程中產生的消耗也是比較大的。例如 select id from table name where num in 1,2,3 對於連續的數值,能用between就盡量不要用in了,再或者使用連線來進行替換...

資料庫優化 sql語句優化

1 group by語句優化 因為mysql對所有group by的字段進行排序,所以如果包含group by但是想要避免排序結果的消耗,可以指定order by null來進行group by的排序。select id,sun moneys from sales group by id expla...

資料庫設計以及優化

select id,from from user 為了避免不必要的麻煩,請不要使用保留關鍵字作為資料庫物件名稱。mysql關鍵字可以使用查詢。create table user user id unsigned int unsigned auto increment not null,create ...