首頁 資料庫 mysql教程 mysql資料庫索引類型有哪幾種?建立方法和優缺點

mysql資料庫索引類型有哪幾種?建立方法和優缺點

Aug 07, 2018 pm 02:55 PM
mysql索引

本文將著重描述masql資料庫索引的四種類型,資料庫索引怎麼建立?在WHERE和JOIN中出現的欄位需要建立索引,但也不完全如此,因為MySQL只對<,<=,=,>,>=,BETWEEN,IN,以及某些時候的LIKE才會使用索引。希望這篇文章能幫助大家,先來了解索引是什麼吧,用一句話概括就是: 索引是快速搜尋的關鍵。

     MySQL索引的建立對於MySQL的高效率運作是很重要的。以下介紹幾個常見的MySQL索引類型

     在資料庫表中,對欄位建立索引可以大幅提高查詢速度。假如我們建立了一個mytable表:

#程式碼如下:

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL  );

  我們隨機隨機向裡面插入了10,000筆記錄,其中有一筆:5555, admin。

    在尋找username="admin"的記錄 SELECT * FROM mytable WHERE username='admin';時,如果在username上已經建立了索引,MySQL無須任何掃描,即準確可找到該記錄。相反,MySQL會掃描所有記錄,也就是要查詢10000筆記錄。

    索引分單列索引和組合索引。單列索引,即一個索引只包含單一資料列,一個表格可以有多個單列索引,但這不是組合索引。組合索引,即一個索包含​​多個列。

MySQL索引類型包括:

一、普通索引

這是最基本的索引,它沒有任何限制。它有以下幾種建立方式:

1.建立索引

程式碼如下:

#CREATE INDEX indexName ON mytable(username(length));

如果是CHAR,VARCHAR類型,length可以小於欄位實際長度;如果是BLOB和TEXT類型,必須指定length,則下同。

2.修改表結構

程式碼如下:
ALTER mytable ADD INDEX [indexName] ON (username(length)) -- 建立表的時候直接指定

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   INDEX [indexName] (username(length))   );# 

-- 刪除索引的語法:

DR INDEX [indexName] ON mytable;

二、唯一索引

#它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種建立方式:

程式碼如下:

CREATE UNIQUE INDEX indexName ON mytable(username(length)) 

-- 修改表格結構
ALTER mytable ADD UNIQUE [indexName] ON (username(length)) 
-- 建立表格的時間直接指定
CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   UNIQUE [indexName] (username(length) )   );

三、主鍵索引

#它是一種特殊的唯一索引,不允許有空值。一般在建表的時候同時建立主鍵索引:

程式碼如下:

##CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   PRIMARY KEY(ID)username VARCHAR(16) NOT NULL,   PRIMARY KEY(ID)username VARCHAR(16) NOT NULL,   PRIMARY KEY(ID)   ) ;

當然也可以用ALTER 指令。記住:一個表只能有一個主鍵。

四、組合索引

為了形像地比較單列索引和組合索引,為表格新增多個欄位:

程式碼如下:

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   city VARCHAR(50) NOT NULL,   age INT NOT NULL  ) 

#;考慮建立組合索引。就是將name, city, age建到一個索引:

程式碼如下:

ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);[code]

建表時,usernname長度為16,這裡用10。這是因為一般情況下名字的長度不會超過10,這樣會加速索引查詢速度,還會減少索引檔案的大小,提高INSERT的更新速度。

如果分別在usernname,city,age上建立單列索引,讓該表有3個單列索引,查詢時和上述的組合索引效率也會大不一樣,遠低於我們的組合索引。雖然此時有了三個索引,但MySQL只能用到其中的那個它認為似乎是最有效率的單列索引。

建立這樣的組合索引,其實是相當於分別建立了下面三組組合索引:

usernname,city,age   usernname,city   usernname  為什麼沒有 city,讓age這樣的組合指標呢?這是因為MySQL組合索引「最左前綴」的結果。簡單的理解就是只從最左邊的開始組合。並不是只要包含這三列的查詢都會用到該組合索引,下面的幾個SQL就會用到這個組合索引:
[code]
SELECT * FROM mytable WHREE username="admin" AND city ="鄭州"  SELECT * FROM mytable WHREE username="admin"

#而下面幾個則不會用到:

程式碼如下:
SELECT * FROM mytable WHREE age=20 AND city="鄭州"  SELECT * FROM mytable WHREE city="鄭州"

五、如何建立索引

到這裡我們已經學會了建立索引,那麼我們需要在什麼情況下建立索引呢?一般來說,在WHERE和JOIN中出現的欄位需要建立索引,但也不完全如此,因為MySQL只對<,<=,=,>,>=,BETWEEN,IN,以及某些時候的LIKE才會使用索引。例如:

程式碼如下:

SELECT t.Name  FROM mytable t LEFT JOIN mytable m    ON t.Name=m.username WHERE m.age=20 AND m.city='鄭州'

此時就需要對city和age建立索引,由於mytable表的userame也出現在了JOIN子句中,也有對它建立索引的必要。

剛才提到只有某些時候的LIKE才需建立索引。因為以通配符%和_開頭作查詢時,MySQL不會使用索引。例如下句會使用索引:

程式碼如下:
SELECT * FROM mytable WHERE username like'admin%'
而下句就不會使用:

程式碼如下:

SELECT * FROM mytable WHEREt Name like'�min'

#因此,在使用LIKE時應注意以上的差異。

六、索引缺點

上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:

1.雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存索引檔。

2.建立索引會佔用磁碟空間的索引檔案。一般情況這個問題不太嚴重,但如果你在一個大表上建立了多種組合索引,索引檔案的會膨脹很快。

索引只是提高效率的一個因素,如果你的MySQL有大數據量的表,就需要花時間研究建立最優秀的索引,或優化查詢語句。

七、使用索引時需要注意:

使用索引時,有以下一些技巧和注意事項:

1.索引不會包含有NULL值的欄位

只要列中包含有NULL值都將不會被包含在索引中,複合索引中只要有一列含有NULL值,那麼這一列對於此複合索引就是無效的。所以我們在資料庫設計時不要讓欄位的預設值為NULL。

2.使用短索引

對串列進行索引,如果可能應該指定一個前綴長度。例如,如果有一個CHAR(255)的列,如果在前10個或20個字元內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁碟空間和I/O操作。

3.索引列排序

MySQL查詢只使用一個索引,因此如果where子句中已經使用了索引的話,那麼order by中的欄位是不會使用索引的。因此資料庫預設排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列建立複合索引。

4.like語句操作

一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。 like “�a%” 不會使用索引而like “aaa%”可以使用索引。

5.不要在列上進行運算

程式碼如下:
select * from users where YEAR(adddate)<2007;

#將在每個行上進行運算,這將導致索引失效而進行全表掃描,因此我們可以改成:

代碼如下:

select * from users where adddate<'2007-01-01' ;

6.不使用NOT IN和<>操作

以上,就對其中MySQL索引類型進行了介紹。希望對大家有幫助。

索引的兩個方法:

B-tree索引

註: 名為btree索引,大的面向看,都用的平衡樹,但具體的實現上, 各存儲引擎稍有不同,比如,嚴格的說,NDB引擎,使用的是T-tree 
Myisam,innodb中,默認用B-tree索引,B-tree的理論查詢時間複雜度為O(log2 (N-1)),N為資料表的行數

hash索引 
使用memory儲存引擎的表中,預設為hash索引, hash的理論查詢時間複雜度為O(1)

相關推薦:

#詳解mysql建立索引的使用辦法及優缺點分析

索引的優點和缺點第1/2頁

以上是mysql資料庫索引類型有哪幾種?建立方法和優缺點的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1421
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
mysql索引失效的幾種情況 mysql索引失效的幾種情況 Feb 21, 2024 pm 04:23 PM

常見情況:1、使用函數或運算;2、隱式類型轉換;3、使用不等於(!=或<>);4、使用LIKE操作符,並以通配符開頭;5、OR條件;6、NULL值;7、索引選擇性低;8、複合索引的最左前綴原則;9、優化器決策;10、FORCE INDEX和IGNORE INDEX。

與MySQL中使用索引相比,全表掃描何時可以更快? 與MySQL中使用索引相比,全表掃描何時可以更快? Apr 09, 2025 am 12:05 AM

全表掃描在MySQL中可能比使用索引更快,具體情況包括:1)數據量較小時;2)查詢返回大量數據時;3)索引列不具備高選擇性時;4)複雜查詢時。通過分析查詢計劃、優化索引、避免過度索引和定期維護表,可以在實際應用中做出最優選擇。

mysql索引什麼情況下會失效 mysql索引什麼情況下會失效 Aug 09, 2023 pm 03:38 PM

mysql索引在不使用索引列進行查詢、資料類型不符、前綴索引的使用不當、使用函數或表達式進行查詢、索引列的順序不正確、資料更新頻繁和索引過多或過少情況下會失效。 1、不使用索引列進行查詢,為了避免這種情況,應在查詢中使用適當的索引列;2、資料類型不匹配,在設計表結構時,應確保索引列和查詢的資料類型匹配;3 、前綴索引的使用不當,可使用前綴索引。

MySQL索引左前綴匹配規則 MySQL索引左前綴匹配規則 Feb 24, 2024 am 10:42 AM

MySQL索引最左原則原理及程式碼範例在MySQL中,索引是提高查詢效率的重要手段之一。其中,索引最左原則是我們在使用索引來優化查詢的過程中需要遵循的一個重要原則。本文將圍繞MySQL索引最左原則的原理進行介紹,並給出一些具體的程式碼範例。一、索引​​最左原則的原理索引最左原則是指在一個索引中,如果查詢條件是由多個列組成的,那麼只有按照索引中的最左側列進行查詢,才能充

說明不同類型的MySQL索引(B樹,哈希,全文,空間)。 說明不同類型的MySQL索引(B樹,哈希,全文,空間)。 Apr 02, 2025 pm 07:05 PM

MySQL支持四種索引類型:B-Tree、Hash、Full-text和Spatial。 1.B-Tree索引適用於等值查找、範圍查詢和排序。 2.Hash索引適用於等值查找,但不支持範圍查詢和排序。 3.Full-text索引用於全文搜索,適合處理大量文本數據。 4.Spatial索引用於地理空間數據查詢,適用於GIS應用。

mysql索引的分類有哪幾種 mysql索引的分類有哪幾種 Apr 22, 2024 pm 07:12 PM

MySQL 索引分為以下類型:1. 普通索引:匹配值、範圍或前綴;2. 唯一索引:確保值唯一;3. 主鍵索引:主鍵列的唯一索引;4. 外鍵索引:指向另一表主鍵;5. 全文索引:全文搜尋;6. 雜湊索引:相等配對搜尋;7.空間索引:地理空間搜尋;8. 複合索引:基於多個欄位的搜尋。

如何合理使用MySQL索引,優化資料庫效能?技術同學須知的設計規約! 如何合理使用MySQL索引,優化資料庫效能?技術同學須知的設計規約! Sep 10, 2023 pm 03:16 PM

如何合理使用MySQL索引,優化資料庫效能?技術同學須知的設計規約!引言:在當今網路時代,資料量不斷成長,資料庫效能最佳化成為了一個非常重要的課題。而MySQL作為最受歡迎的關係型資料庫之一,索引的合理使用對於提升資料庫效能至關重要。本文將介紹如何合理使用MySQL索引,優化資料庫效能,並為技術同學提供一些設計規約。一、為什麼要使用索引?索引是一種資料結構,用

PHP與MySQL索引的資料更新和索引維護的效能最佳化策略及其對效能的影響 PHP與MySQL索引的資料更新和索引維護的效能最佳化策略及其對效能的影響 Oct 15, 2023 pm 12:15 PM

PHP與MySQL索引的資料更新和索引維護的效能最佳化策略及其對效能的影響摘要:在PHP與MySQL的開發中,索引是最佳化資料庫查詢效能的重要工具。本文將介紹索引的基本原理和使用方法,並探討索引對資料更新和維護的效能影響。同時,本文也提供了一些效能優化策略和具體的程式碼範例,幫助開發者更好地理解和應用索引。索引的基本原理和使用方法在MySQL中,索引是一種特殊的數

See all articles