優化資料庫的10個建議

2021-06-17 14:50:23 字數 3980 閱讀 8935

第乙個技巧也許看來理所當然,但事實上大部分資料庫的問題都來自於設計不好的資料庫結構。譬如我曾經遇見過將客戶端資訊和支付資訊儲存在同乙個資料庫列中的例子。對於系統和用資料庫的開發者來說,這很糟糕。新建資料庫時,應當將資訊儲存在不同的表裡,採用標準的命名方式,並採用主鍵。

如果你想優化某個查詢語句,清楚的知道這個語句的結果是非常有幫助的。採用explain語句,你將獲得很多有用的資訊,下面來看個例子:

[sql]view plain

copy

print?

explain 

select

* from

ref_table,other_table 

where

ref_table.key_column=other_table.

column

;  

每次你向資料庫傳送一條語句,你都會用掉很多伺服器資源。所以在很高流量的**中,最好的方法是將你的查詢語句快取起來。memcached:memcached是一種分布式記憶體快取系統,它可以減輕資料庫的負載,來加速基於動態資料庫的**。

獲取想要的資料,一種非常常見的方式就是採用*字元,這會列出所有的列。

[sql]view plain

copy

print?

select

* from

wp_posts;  

然而,你應該僅列出你需要的列,如下所示。如果在乙個非常小型的**,譬如,一分鐘乙個使用者訪問,可能沒有什麼分別。然而如果像cats who code這樣大流量的**,這就為資料庫省了很多事。

[sql]view plain

copy

print?

elect title, excerpt, author 

from

wp_posts;  

僅獲得某個特定行數的資料是非常常見的。譬如部落格每頁只顯示十篇文章。這時,你應該使用limit,來限定你想選定的資料的行數。

如果沒有limit,表有100,000行資料,你將會遍歷所有的行數,這對於伺服器來說是不必要的負擔。

[sql]view plain

copy

print?

select

title, excerpt, author 

from

wp_posts limit 10 ;  

當在php中使用sql時,可以將sql放在迴圈語句中。但這麼做給你的資料庫增加了負擔。

下面的例子說明了「在迴圈語句中巢狀查詢語句」的問題:

[php]view plain

copy

print?

foreach

($display_order

as$id

=> 

$ordinal

)   

[php]view plain

copy

print?

update categories  

set display_order = case id  

when 1 then 3  

when 2 then 4  

when 3 then 5  

endwhere id in ( 1 , 2 , 3 )  

程式設計師

可能會喜歡用子查詢,甚至濫用。下面的子查詢非常有用:

[sql]view plain

copy

print?

select

a.id,  

(select

max(created)  

from

posts  

where

author_id = a.id)  

aslatest_post 

from

authors a  

雖然子查詢很有用,但join語句可以替換它,join語句執行起來更快。

[sql]view plain

copy

print?

select

a.id, 

max(p.created) 

aslatest_post  

from

authors a  

inner

join

posts p  

on(a.id = p.author_id)  

group

bya.id  

萬用字元非常好用,在搜尋資料的時候可以用萬用字元來代替乙個或多個字元。我不是說不能用,而是,應該小心使用,並且不要使用全詞萬用字元(full wildcard),字首萬用字元或後置萬用字元可以完成相同的任務。

事實上,在百萬數量級的資料上採用全詞萬用字元來搜尋會讓你的資料庫當機。

[sql]view plain

copy

print?

#full

wildcard  

select

* from

table

where

column

like

'%hello%'

;  #postfix wildcard  

select

* from

table

where

column

like

'hello%'

;  #prefix wildcard  

select

* from

table

where

column

like

'%hello'

;  

下面的例子採用or語句來:

[sql]view plain

copy

print?

select

* from

a, b 

where

a.p = b.q 

ora.x = b.y;  

[sql]view plain

copy

print?

select

* from

a, b 

where

a.p = b.q  

union

select

* from

a, b 

where

a.x = b.y  

資料庫索引和你在圖書館中見到的索引類似:能讓你更快速的獲取想要的資訊,正如圖書館中的索引能讓讀者更快的找到想要的書一樣。

可以在乙個列上建立索引,也可以在多個列上建立。索引是一種資料結構,它將表中的一列或多列的值以特定的順序組織起來。

下面的語句在product表的model列上建立索引。這個索引的名字叫作idxmodel

[sql]view plain

copy

print?

create

index

idxmodel 

onproduct (model)

伺服器資料庫系列 優化資料庫的10個建議

第乙個技巧也許看來理所當然,但事實上大部分資料庫的問題都來自於設計不好的資料庫結構。譬如我曾經遇見過將客戶端資訊和支付資訊儲存在同乙個資料庫列中的例子。對於系統和用資料庫的開發者來說,這很糟糕。新建資料庫時,應當將資訊儲存在不同的表裡,採用標準的命名方式,並採用主鍵。如果你想優化某個查詢語句,清楚的...

資料庫優化建議

1.建立索引時,按照索引字段重複最少來排序,盡量建立復合索引。2.應考慮在where及order by涉及的列上建立索引。3.select時,不要返回不需要的行。4.sql中where的第乙個條件寫聚集索引,where條件中建立了索引的字段要放在前面。5.聯合查詢時,使用exists 或not ex...

讓資料庫變快的10個建議

大多數 的內容都存在資料庫裡,使用者通過請求來訪問內容。資料庫非常的快,有許多技巧能讓你優化資料庫的速度,使你不浪費伺服器的資源。在這篇文章中,我收錄了十個優化資料庫速度的技巧。1 小心設計資料庫 第乙個技巧也許看來理所當然,但事實上大部分資料庫的問題都來自於設計不好的資料庫結構。譬如我曾經遇見過將...