明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

為數(shù)據(jù)庫創(chuàng)建索引(一)

[摘要]就象許多的PHP開發(fā)者一樣,在剛開始建立動態(tài)網(wǎng)站的時(shí)候,我都是使用相對簡單的數(shù)據(jù)結(jié)構(gòu)。PHP在連接數(shù)據(jù)庫方面的確實(shí)是十分方便(譯者注:有些人認(rèn)為PHP在連接不同數(shù)據(jù)庫時(shí)沒有一個(gè)統(tǒng)一的接口,不太方便,...
就象許多的PHP開發(fā)者一樣,在剛開始建立動態(tài)網(wǎng)站的時(shí)候,我都是使用相對簡單的數(shù)據(jù)結(jié)構(gòu)。PHP在連接數(shù)據(jù)庫方面的確實(shí)是十分方便(譯者注:有些人認(rèn)為PHP在連接不同數(shù)據(jù)庫時(shí)沒有一個(gè)統(tǒng)一的接口,不太方便,其實(shí)這可以通過一些擴(kuò)展庫來做到這一點(diǎn)),你無需看大量的設(shè)計(jì)文檔就可以建立和使用數(shù)據(jù)庫,這也是PHP獲得成功的主要原因之一。

  前些時(shí)候,一位頗高級的程序員居然問我什么叫做索引,令我感到十分的驚奇,我想這絕不會是滄海一粟,因?yàn)橛谐汕先f的開發(fā)者(可能大部分是使用MySQL的)都沒有受過有關(guān)數(shù)據(jù)庫的正規(guī)培訓(xùn),盡管他們都為客戶做過一些開發(fā),但卻對如何為數(shù)據(jù)庫建立適當(dāng)?shù)乃饕^少,因此我起了寫一篇相關(guān)文章的念頭。

  最普通的情況,是為出現(xiàn)在where子句的字段建一個(gè)索引。為方便講述,我們先建立一個(gè)如下的表。

  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
  );

  很簡單吧,不過對于要說明這個(gè)問題,已經(jīng)足夠了。如果你在查詢時(shí)常用類似以下的語句:

   SELECT * FROM mytable WHERE category_id=1;

  最直接的應(yīng)對之道,是為category_id建立一個(gè)簡單的索引:

   CREATE INDEX mytable_categoryid
     ON mytable (category_id);

  OK,搞定?先別高興,如果你有不止一個(gè)選擇條件呢?例如:

   SELECT * FROM mytable WHERE category_id=1 AND user_id=2;

  你的第一反應(yīng)可能是,再給user_id建立一個(gè)索引。不好,這不是一個(gè)最佳的方法。你可以建立多重的索引。

  CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);

  注意到我在命名時(shí)的習(xí)慣了嗎?我使用"表名_字段1名_字段2名"的方式。你很快就會知道我為什么這樣做了。

  現(xiàn)在你已經(jīng)為適當(dāng)?shù)淖侄谓⒘怂饕贿^,還是有點(diǎn)不放心吧,你可能會問,數(shù)據(jù)庫會真正用到這些索引嗎?測試一下就OK,對于大多數(shù)的數(shù)據(jù)庫來說,這是很容易的,只要使用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的數(shù)據(jù),可以看到該數(shù)據(jù)庫在查詢的時(shí)候使用了一個(gè)索引(一個(gè)好開始),而且它使用的是我創(chuàng)建的第二個(gè)索引?吹轿疑厦婷暮锰幜税,你馬上知道它使用適當(dāng)?shù)乃饕恕?br>