就象許多的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)
//開源代碼phpfensi.com
EXPLAIN
以上是postgres的數據,可以看到該數據庫在查詢的時候使用了一個索引,一個好開始,而且它使用的是我創建的第二個索引,看到我上面命名的好處了吧,你馬上知道它使用適當的索引了.
接著,來個稍微復雜一點的,假如有個ORDER BY字句呢?不管你信不信,大多數的數據庫在使用order by的時候,都將會從索引中受益.
SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
新聞熱點
疑難解答