MySQL5 0中索引的設計和使用

2021-08-30 10:36:05 字數 3205 閱讀 8883

很多開發者對mysql還是有深厚的感情,雖然現在已經被收購。至於mysql的前途到底是否會被開源組織接手還是怎麼樣?這個就暫時無解了。不過我想至少mysql的確有它的優勢。廢話就不說了。

下面討論下mysql5.0中的索引的設計和使用。任何東西設計的好,那麼使用起來就順手。不過很多時候給出設計什麼規則這些都是相對的。做任何的事情,最重要的是能否根據當時情況就合理的調整你的設計。如果你只會看著書本或者權威來死套什麼設計理念來進行實際的開發和設計的話,那麼我請你還是少讀書為妙。

索引是資料庫中用來[b]提高效能[/b]的常用工具。(注意如果要優化資料庫的效能,這是乙個點)。

所有mysql列型別都可以被索引,對相關列使用索引是提高select操作效能的最佳途徑。根據儲存引擎可以定義每個表的最大索引數和最大索引長度,每種儲存引擎(myisam、innodb、bdb、memory等)對每個表至少支援16個索引,總索引長度至少為256位元組。大多數儲存引擎有更高的限制。

myisam和innodb儲存引擎的表預設建立的都是btree索引。mysql目前還不支援函式索引,但是支援字首索引,即對索引欄位的前n個字元建立索引。字首索引的長度跟儲存引擎相關,對於myisam儲存引擎的表,索引的字首長度可以達到1000位元組長,而對於inn0db儲存引擎的表,索引的字首長度最長是767位元組。請注意字首的限制應以位元組為單位進行測量,而create table語句中的字首長度解釋為字元數。在為使用多位元組字符集的列指定字首長度時一定要加以考慮。

mysql中還支援全文本索引(fulltext),該索引可以用於全文搜尋。但是在mysql5.0中只有myisam儲存引擎支援全文本索引,並且僅僅侷限於char、varchar和text列。索引總是對整個列進行的,不支援區域性索引。也可以為空間型別建立索引,但是只要myisam儲存引擎支援空間型別索引,而且索引的字段必須是非空。

建立索引的語法如下:

[quote]

create [unique | fulltext | spatial] idex index_name

[using index_type]

on tb1_name (index_col_name,....)

index_col_name:

col_name [(length)][asc | desc]

[/quote]

索引的建立可以在建立表的時候就建立,也可以隨時增加新的索引。

下面給出乙個例子:

[quote]

create index personname on person (person(10))

[/quote]

查詢,可以發現索引personname被使用

[quote]

explain select * from person where person='hi' \g

[/quote]

索引的刪除語法為:

[quote]

drop index index_name on tb1_name

[/quote]

如果想刪除person表中的personname索引如下操作

[quote]

drop index personname on person

[/quote]

上面簡單的演示了索引的建立和刪除。

接下來討論下索引的設計原則:

索引的設計可以遵循一些已有的原則,建立索引的時候請[b]盡量考慮[/b]符合這些原則,便於提公升索引的使用效率,更高效地使用索引。

[b]1. 搜尋的索引列,不一定是所要選擇的列[/b]。最合適索引的列式出現在where子句中的列,或連線子句中指定的列,而不是出現在select關鍵字後的選擇列表中的列。

[b]2. 使用唯一索引[/b]。考慮某列中值的分布。索引的列的基數越大,索引的效果越好。例如資料庫中有好幾年的資料,這些資料中有日期這個字段,而且查詢中常常要區分日期。那麼針對日期設索引就很容易區分。

[b]3. 使用短索引[/b]。如果對字串列進行索引,應該指定應該字首長度,只要有可能就應該這樣做。例如:如果有乙個char(200)的列,如果在前10個或20個字元內,多數值是唯一的。那麼就不要對整個列進行索引。對前10個或者20個字元進行索引能夠節省大量索引空間,也可能會是查詢更快。較小的索引涉及的磁碟io較少,較短的值比較起來更快。更為重要的是,對於較短的鍵值,索引快取記憶體中的塊能容納更多的鍵值,因此,mysql也可以在記憶體中容納更多的值。這樣就增加了找到行而不用讀取索引中較多塊的可能性。

[b]4.利用最左字首[/b]。在建立乙個n列的索引時,實際是建立了mysql可利用的n個索引。多列索引起幾個索引的作用,因為可利用索引中最左的列集來匹配行。這樣的列集稱最左字首。

[b]5. 不要過度索引[/b]。不要以為索引「越多越好」,什麼東西都用索引時錯誤的。每個額外的索引都要占用額外的磁碟空間,並降低寫操作的效能。在修改表的內容時,索引必須進行更新,有時可能需要重構,因此,索引越多,所花的時間越長。如果有乙個索引很少利用或者從不使用,那麼會不必要地減緩表的修改速度。此為mysql在生成乙個執行計畫時,要考慮各個索引,這也要花費時間。建立多餘的索引給查詢優化帶來了更多的工作。索引太多,也可能會使mysql選擇不到所要使用的最好索引。值保持所需的索引有利於查詢優化。

[b]6. 對於innodb儲存引擎的表[/b],記錄缺省會按照乙個的順序儲存,如果有明確定義的主鍵,則按照主鍵順序儲存。如果沒有主鍵,但是有唯一索引,那麼就是按照唯一索引的順序儲存。如果既沒有主鍵有沒有唯一索引,那麼表中會自動生成乙個內部列,按照這個列的順序儲存。按照主鍵或者內部列進行的訪問是最快的,所以innodb表盡量自己指定主鍵,當表中同時有幾個列都是唯一的,都可以作為主鍵的時候,要選擇最常作為訪問條件的列作為主鍵,提高查詢的效率。另外還需要注意,innodb表的普通索引都會儲存主鍵的鍵值,所以主鍵要盡可能選擇較短的資料型別,可以有效減少索引的磁碟占用,提高索引的快取效果。

[b] btree索引與hash索引[/b]

memory儲存引擎的表可以選擇使用btree或者hash索引,兩種不同型別的索引各有其不同的適用範圍。hash索引有些重要的特徵需要在使用的時候特別注意,如下所示:

1. 只用於使用=或<=>操作符的等式比較。

2. 優化器不能使用hash索引來加速order by操作

3. mysql不能確定在兩個值之間大約有多少行。如果將乙個myisam表改為hash索引的memory表,會影響一些查詢的執行效率。

4. 只能使用整個關鍵字來搜尋一行。

而對於btree索引,當使用 > 、< 、>= 、<= 、between 、!= 或者 <> ,或者linke'pattern'(其中'pattern'不以萬用字元開始)操作符時,都可以使用相關列上的索引。

mysql 5 0 慢日誌 MySQL的慢查詢日誌

慢查詢日誌是什麼?慢查詢日誌是mysql提供的一種專門記錄sql執行時間超過預先設定好閾值的語句等資訊 慢查詢日誌怎麼開啟?慢查詢日誌是預設關閉的 可以通過命令進行檢視慢日誌的狀態 show variables like slow query log 檢視慢日誌狀態 開啟慢日誌的命令 1代表開啟,0...

mysql5 0觸發器的使用介紹

執行成功的觸發器的建立例項 delimiter drop trigger zwgk sys unit clear t create trigger sys unit clear t after delete on sys unit for each row begin delete from sys...

mysql5 0觸發器的使用介紹

執行成功的觸發器的建立例項 delimiter drop trigger zwgk sys unit clear t create trigger sys unit clear t after delete on sys unit for each row begin delete from sys...