Sunday, June 6, 2010

MySQL Index(1) | Dream-ism

對於剛接觸MySQL的新手,可能會不了解索引(Index)的功用,認為反正我就建個資料庫各個Table,能讓程式Work就好
其實,建索引的目的在於幫助MySQL在搜尋時能更快找到符合你Query的結果,可以想像成,當我們在看書時,往往會在某頁貼上一個便利貼,方便我們下次閱讀
其實我們生活中常常為了我們方便而建了不少索引,所以假如您對MySQL有興趣,或是剛接觸MySQL的人,我想趁現在就開始養成建索引的習慣,即使把握住最基本
的建索引的規則,也能讓你的資料庫提升超出你想像的效率^^



MySQL索引是以B-Tree方式儲存,index可以是一個欄位或是由多個欄位複合而成。

MySQL提供多種索引類型供選擇:
1. 普通索引
這是最基本的索引類型,而且它沒有唯一性之類的限制。普通索引可以通過以下幾種方式創建:

o 創建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);

o 修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);


o 創建表的時候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );

2. 唯一性索引
這種索引和前面的“普通索引”基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須唯一。唯一性索引可以用以下幾種方式創建:

o 創建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);

o 修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);

o 創建表的時候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );

3. 主鍵
主鍵是一種唯一性索引,但它必須指定為“PRIMARY KEY”。如果你曾經用過AUTO_INCREMENT類型的列,你可能已經熟悉主鍵之類的概念了。主鍵一般在創建表的時候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我們也可以通過修改表的方式加入主鍵,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每個表只能有一個主鍵。

4. 全文索引
MySQL從3.23.23版開始支援全文索引和全文檢索。在MySQL中,全文索引的索引類型為FULLTEXT。全文索引可以在VARCHAR或者TEXT類型的列上創建。它可以通過CREATE TABLE命令創建,也可以通過ALTER TABLE或CREATE INDEX命令創建。對於大規模的資料集,通過ALTER TABLE(或者CREATE INDEX)命令創建全文索引要比把記錄插入帶有全文索引的空表更快。本文下面的討論不再涉及全文索引,要瞭解更多資訊,請參見MySQL documentation。

判斷何時該建立Index,針對哪些欄位設定為index
在性能優化過程中,選擇在哪些列上創建索引是最重要的步驟之一。可以考慮使用索引的主要有兩種類型的列:在WHERE子句中出現的列,在join子句中出現的列。請看下面這個查詢:

SELECT age ## 不使用索引 FROM people WHERE firstname=\’Mike\’ ## 考慮使用索引 AND lastname=\’Sullivan\’ ## 考慮使用索引

這個查詢與前面的查詢略有不同,但仍屬於簡單查詢。由於age是在SELECT部分被引用,MySQL不會用它來限制列選擇操作。因此,對於這個查詢來說,創建age列的索引沒有什麼必要。下面是一個更複雜的例子:

SELECT people.age, ##不使用索引 town.name ##不使用索引 FROM people LEFT JOIN town ON people.townid=town.townid ##考慮使用索引 WHERE firstname=\’Mike\’ ##考慮使用索引 AND lastname=\’Sullivan\’ ##考慮使用索引

與前面的例子一樣,由於firstname和lastname出現在WHERE子句中,因此這兩個列仍舊有創建索引的必要。除此之外,由於town表的townid列出現在join子句中,因此我們需要考慮創建該列的索引。

那麼,我們是否可以簡單地認為應該索引WHERE子句和join子句中出現的每一個列呢?差不多如此,但並不完全。我們還必須考慮到對列進行比較的操作符類型。MySQL只有對以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些時候的LIKE。可以在LIKE操作中使用索引的情形是指另一個運算元不是以萬用字元(%或者_)開頭的情形。例如,“SELECT peopleid FROM people WHERE firstname LIKE \’Mich%\’;”這個查詢將使用索引,但“SELECT peopleid FROM people WHERE firstname LIKE \’%ike\’;”這個查詢不會使用索引。

Google Android SDK 開發範例大全2 :: 痞客邦 PIXNET ::

Google Android SDK 開發範例大全2 :: 痞客邦 PIXNET ::

##HIDEME##