就象許多的PHP開發人員一樣,在剛開始建立動態網站的時候,我都是使用相對簡單的資料結構。PHP在串連資料庫方面的確實是十分方便(譯者註:有些人認為PHP在串連不同資料庫時沒有一個統一的介面,不太方便,其實這可以通過一些擴充庫來做到這一點),你無需看大量的設計文檔就可以建立和使用資料庫,這也是PHP獲得成功的主要原因之一。
前些時候,一位頗進階的程式員居然問我什麼叫做索引,令我感到十分的驚奇,我想這絕不會是滄海一粟,因為有成千上萬的開發人員(可能大部分是使用MySQL的)都沒有受過有關資料庫的正規培訓,儘管他們都為客戶做過一些開發,但卻對如何為資料庫建立適當的索引所知較少,因此我起了寫一篇相關文章的念頭。
最普通的情況,是為出現在where子句的欄位建一個索引。為方便講述,我們先建立一個如下的表。
CREATE TABLE mytable (
id serial primary key,
category_id int not null default 0,
user_id int not null default 0,
adddate int not null default 0
);
很簡單吧,不過對於要說明這個問題,已經足夠了。如果你在查詢時常用類似以下的語句:
SELECT * FROM mytable WHERE category_id=1;
最直接的應對之道,是為category_id建立一個簡單的索引:
CREATE INDEX mytable_categoryid
ON mytable (category_id);
OK,搞定?先別高興,如果你有不止一個選擇條件呢?例如:
SELECT * FROM mytable WHERE category_id=1 AND user_id=2;
你的第一反應可能是,再給user_id建立一個索引。不好,這不是一個最佳的方法。你可以建立多重的索引。
CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);
注意到我在命名時的習慣了嗎?我使用"表名_欄位1名_欄位2名"的方式。你很快就會知道我為什麼這樣做了。
現在你已經為適當的欄位建立了索引,不過,還是有點不放心吧,你可能會問,資料庫會真正用到這些索引嗎?測試一下就OK,對於大多數的資料庫來說,這是很容易的,只要使用EXPLAIN命令:
EXPLAIN
SELECT * FROM mytable
WHERE category_id=1 AND user_id=2;
This is what Postgres 7.1 returns (exactly as I expected)
NOTICE: QUERY PLAN:
Index Scan using mytable_categoryid_userid on
mytable (cost=0.00..2.02 rows=1 width=16)
EXPLAIN
以上是postgres的資料,可以看到該資料庫在查詢的時候使用了一個索引(一個好開始),而且它使用的是我建立的第二個索引。看到我上面命名的好處了吧,你馬上知道它使用適當的索引了。
http://www.bkjia.com/PHPjc/631058.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/631058.htmlTechArticle就象許多的PHP開發人員一樣,在剛開始建立動態網站的時候,我都是使用相對簡單的資料結構。PHP在串連資料庫方面的確實是十分方便(譯者...