搜尋
首頁資料庫mysql教程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)

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

代碼如下:

select * from users where adddate

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
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索引什么情况下会失效Aug 09, 2023 pm 03:38 PM

mysql索引在不使用索引列进行查询、数据类型不匹配、前缀索引的使用不当、使用函数或表达式进行查询、索引列的顺序不正确、数据更新频繁和索引过多或过少情况下会失效。1、不使用索引列进行查询,为了避免这种情况,应该在查询中使用适当的索引列;2、数据类型不匹配,在设计表结构时,应该确保索引列和查询的数据类型匹配;3、前缀索引的使用不当,可使用前缀索引。

MySQL索引左前缀匹配规则MySQL索引左前缀匹配规则Feb 24, 2024 am 10:42 AM

MySQL索引最左原则原理及代码示例在MySQL中,索引是提高查询效率的重要手段之一。其中,索引最左原则是我们在使用索引优化查询的过程中需要遵循的一个重要原则。本文将围绕MySQL索引最左原则的原理进行介绍,并给出一些具体的代码示例。一、索引最左原则的原理索引最左原则是指在一个索引中,如果查询条件是由多个列组成的,那么只有按照索引中的最左侧列进行查询,才能充

mysql索引的分类有哪几种mysql索引的分类有哪几种Apr 22, 2024 pm 07:12 PM

MySQL 索引分为以下类型:1. 普通索引:匹配值、范围或前缀;2. 唯一索引:确保值唯一;3. 主键索引:主键列的唯一索引;4. 外键索引:指向另一表主键;5. 全文索引:全文搜索;6. 哈希索引:相等匹配搜索;7. 空间索引:地理空间搜索;8. 复合索引:基于多个列的搜索。

PHP与MySQL索引的数据更新和索引维护的性能优化策略及其对性能的影响PHP与MySQL索引的数据更新和索引维护的性能优化策略及其对性能的影响Oct 15, 2023 pm 12:15 PM

PHP与MySQL索引的数据更新和索引维护的性能优化策略及其对性能的影响摘要:在PHP与MySQL的开发中,索引是优化数据库查询性能的重要工具。本文将介绍索引的基本原理和使用方法,并探讨索引对数据更新和维护的性能影响。同时,本文还提供了一些性能优化策略和具体的代码示例,帮助开发者更好地理解和应用索引。索引的基本原理和使用方法在MySQL中,索引是一种特殊的数

如何合理使用MySQL索引,优化数据库性能?技术同学须知的设计规约!如何合理使用MySQL索引,优化数据库性能?技术同学须知的设计规约!Sep 10, 2023 pm 03:16 PM

如何合理使用MySQL索引,优化数据库性能?技术同学须知的设计规约!引言:在当今互联网时代,数据量不断增长,数据库性能优化成为了一个非常重要的课题。而MySQL作为最流行的关系型数据库之一,索引的合理使用对于提升数据库性能至关重要。本文将介绍如何合理使用MySQL索引,优化数据库性能,并为技术同学提供一些设计规约。一、为什么要使用索引?索引是一种数据结构,用

Explain different types of MySQL indexes (B-Tree, Hash, Full-text, Spatial).Explain different types of MySQL indexes (B-Tree, Hash, Full-text, Spatial).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中创建唯一索引来确保数据唯一性Mar 15, 2024 pm 12:45 PM

标题:MySQL中创建唯一索引来确保数据唯一性的方法及代码示例在数据库设计中,确保数据的唯一性是非常重要的,可以通过在MySQL中创建唯一索引来实现。唯一索引可以保证表中某列(或列组合)的数值是唯一的,如果尝试插入重复值,MySQL会阻止这种操作并报错。本文将介绍如何在MySQL中创建唯一索引,同时提供具体的代码示例。什么是唯一索引唯一索引是一种索引类型,它

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能