優化sql語句

2021-08-09 13:54:18 字數 2821 閱讀 5450

(空、不等、or)

(exists、in、like、表示式、函式)

如:

select id from

table

where name is

null

在這個查詢中,就算我們為 name 字段設定了索引,查詢分析器也不會使用,因此查詢效率底下。為了避免這樣的查詢,在資料庫設計的時候,盡量將可能會出現 null 值的字段設定預設值,這裡如果我們將 name 欄位的預設值設定為0,那麼我們就可以這樣查詢:

select id from

table

where name = 0

如:

select name from

table

where id <> 0

資料庫在查詢時,對 != 或 <> 操作符不會使用索引,而對於 < 、 <= 、 = 、 > 、 >= 、 between and,資料庫才會使用索引。因此對於上面的查詢,正確寫法應該是:

select name from

table

where id < 0

union

allselect name from

table

where id > 0

這裡我們為什麼沒有使用 or 來鏈結 where 後的兩個條件呢?這就是我們下面要說的第3個優化技巧。

如:

select id from tabel where name = 'uncletoo'

or name = 'php'

這種情況,我們可以這樣寫:

select id from tabel where name = 'uncletoo'

union

allselect id from tabel where name = 'php'

select name

from tabel where

idin(1,2,3,4,5)

像這種連續的數值,我們可以使用 between and,如:

select name

from tabel where

idbetween

1and

5

下面的語句會導致全表掃瞄,盡量少用。如:

select id from tabel where name like

'%uncletoo%'

或者select id from tabel where name like

'%uncletoo'

而下面的語句執行效率要快的多,因為它使用了索引:

select id from tabel where name like

'uncletoo%'

如:

select name from

table

where id/2 = 100

正確的寫法應該是:

select name from

table

where id = 100*2

如:

select id from

table

where substring(name,1,8) = 'uncletoo'

或select id from

table

where datediff(day,datefield,'2014-07-17') >= 0

這兩條語句中都對字段進行了函式處理,這樣就是的查詢分析器放棄了索引的使用。正確的寫法是這樣的:

select id from

table

where name like

'uncletoo%'

或select id from

table

where datefield <= '2014-07-17'

也就是說,不要在 where 子句中的 = 左邊進行函式、算術運算或其他表示式運算。

如:

select name from a where id in(select id from b)

如果我們將這條語句換成下面的寫法:

select name from a where

exists(select

1from b where id = a.id)

這樣,查詢出來的結果一樣,但是下面這條語句查詢的速度要快的多。

# 6.1

exists查詢(不存在則為~exists())

from sqlalchemy.sql import exists

session.query(user.name).filter(~exists().where(user.role_id == role.id))

# select name as users_name from users where

notexists (select * from roles where users.role_id = roles.id)

# 6.2 除了exists,any也可以表示exists

session.query(role).filter(role.users.any())

# 7 random

from sqlalchemy.sql.functions import random

user = session.query(user).order_by(random()).first()

session.close()

SQL 語句優化 OR 語句優化案例

從上海來到溫州,看了前幾天監控的sql語句和資料變化,發現有一條語句的io次數很大,達到了150萬次io,而兩個表的資料也就不到20萬,為何有如此多的io次數,下面是執行語句 select ws.nodeid,wi.laststepid,wi.curstepid from workflowinfo ...

sql語句優化!

1.不要使用in操作符,這樣資料庫會進行全表掃瞄,推薦方案 在業務密集的sql當中盡量不採用in操作符 a 改為 a 4.is null 或is not null操作 判斷字段是否為空 5.及 操作符 大於或小於操作符 大於或小於操作符一般情況下是不用調整的,因為它有索引就會採用索引查詢,但有的情況...

SQL語句優化

explain sql 反饋sql語句執行資訊 1 優化 select min id as nid,uid pmzongfen updatetime picid gg from qd mouldu qd sell limit 1 select uid pmzongfen updatetime pic...