在mysql中,索引可以用來(lái)快速查詢(xún)數(shù)據(jù)表中有某一特定值的記錄,大大加快數(shù)據(jù)的查詢(xún)速度;在列上創(chuàng)建了索引之后,查找數(shù)據(jù)時(shí)可以直接根據(jù)該列上的索引找到對(duì)應(yīng)記錄行的位置,從而快捷地查找到數(shù)據(jù)。如果表中查詢(xún)的列有一個(gè)索引,MySQL就能快速到達(dá)一個(gè)位置去搜索數(shù)據(jù)文件,而不必查看所有數(shù)據(jù),這樣將會(huì)節(jié)省很大一部分時(shí)間;且通過(guò)創(chuàng)建唯一索引可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。
本教程操作環(huán)境:windows7系統(tǒng)、mysql8版本、Dell G3電腦。
索引是一種特殊的數(shù)據(jù)庫(kù)結(jié)構(gòu),由數(shù)據(jù)表中的一列或多列組合而成,可以用來(lái)快速查詢(xún)數(shù)據(jù)表中有某一特定值的記錄。
通過(guò)索引,查詢(xún)數(shù)據(jù)時(shí)不用讀完記錄的所有信息,而只是查詢(xún)索引列。否則,數(shù)據(jù)庫(kù)系統(tǒng)將讀取每條記錄的所有信息進(jìn)行匹配。
可以把索引比作新華字典的音序表。例如,要查“庫(kù)”字,如果不使用音序,就需要從字典的 400 頁(yè)中逐頁(yè)來(lái)找。但是,如果提取拼音出來(lái),構(gòu)成音序表,就只需要從 10 多頁(yè)的音序表中直接查找。這樣就可以大大節(jié)省時(shí)間。
因此,使用索引可以很大程度上提高數(shù)據(jù)庫(kù)的查詢(xún)速度,還有效的提高了數(shù)據(jù)庫(kù)系統(tǒng)的性能。
為什么要使用索引
索引就是根據(jù)表中的一列或若干列按照一定順序建立的列值與記錄行之間的對(duì)應(yīng)關(guān)系表,實(shí)質(zhì)上是一張描述索引列的列值與原表中記錄行之間一 一對(duì)應(yīng)關(guān)系的有序表。
索引是 MySQL 中十分重要的數(shù)據(jù)庫(kù)對(duì)象,是數(shù)據(jù)庫(kù)性能調(diào)優(yōu)技術(shù)的基礎(chǔ),常用于實(shí)現(xiàn)數(shù)據(jù)的快速檢索。
在 MySQL 中,通常有以下兩種方式訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)表的行數(shù)據(jù):
1) 順序訪(fǎng)問(wèn)
順序訪(fǎng)問(wèn)是在表中實(shí)行全表掃描,從頭到尾逐行遍歷,直到在無(wú)序的行數(shù)據(jù)中找到符合條件的目標(biāo)數(shù)據(jù)。
順序訪(fǎng)問(wèn)實(shí)現(xiàn)比較簡(jiǎn)單,但是當(dāng)表中有大量數(shù)據(jù)的時(shí)候,效率非常低下。例如,在幾千萬(wàn)條數(shù)據(jù)中查找少量的數(shù)據(jù)時(shí),使用順序訪(fǎng)問(wèn)方式將會(huì)遍歷所有的數(shù)據(jù),花費(fèi)大量的時(shí)間,顯然會(huì)影響數(shù)據(jù)庫(kù)的處理性能。
2) 索引訪(fǎng)問(wèn)
索引訪(fǎng)問(wèn)是通過(guò)遍歷索引來(lái)直接訪(fǎng)問(wèn)表中記錄行的方式。
使用這種方式的前提是對(duì)表建立一個(gè)索引,在列上創(chuàng)建了索引之后,查找數(shù)據(jù)時(shí)可以直接根據(jù)該列上的索引找到對(duì)應(yīng)記錄行的位置,從而快捷地查找到數(shù)據(jù)。索引存儲(chǔ)了指定列數(shù)據(jù)值的指針,根據(jù)指定的排序順序?qū)@些指針排序。
例如,在學(xué)生基本信息表 tb_students 中,如果基于 student_id 建立了索引,系統(tǒng)就建立了一張索引列到實(shí)際記錄的映射表。當(dāng)用戶(hù)需要查找 student_id 為 12022 的數(shù)據(jù)的時(shí)候,系統(tǒng)先在 student_id 索引上找到該記錄,然后通過(guò)映射表直接找到數(shù)據(jù)行,并且返回該行數(shù)據(jù)。因?yàn)閽呙杷饕乃俣纫话氵h(yuǎn)遠(yuǎn)大于掃描實(shí)際數(shù)據(jù)行的速度,所以采用索引的方式可以大大提高數(shù)據(jù)庫(kù)的工作效率。
簡(jiǎn)而言之,不使用索引,MySQL 就必須從第一條記錄開(kāi)始讀完整個(gè)表,直到找出相關(guān)的行。表越大,查詢(xún)數(shù)據(jù)所花費(fèi)的時(shí)間就越多。如果表中查詢(xún)的列有一個(gè)索引,MySQL 就能快速到達(dá)一個(gè)位置去搜索數(shù)據(jù)文件,而不必查看所有數(shù)據(jù),這樣將會(huì)節(jié)省很大一部分時(shí)間。
索引的優(yōu)點(diǎn)如下:
-
通過(guò)創(chuàng)建唯一索引可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。
-
可以給所有的 MySQL 列類(lèi)型設(shè)置索引。
-
可以大大加快數(shù)據(jù)的查詢(xún)速度,這是使用索引最主要的原因。
-
在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面可以加速表與表之間的連接。
-
在使用分組和排序子句進(jìn)行數(shù)據(jù)查詢(xún)時(shí)也可以顯著減少查詢(xún)中分組和排序的時(shí)間
注:索引可以提高查詢(xún)速度,但是會(huì)影響插入記錄的速度。因?yàn)?,向有索引的表中插入記錄時(shí),數(shù)據(jù)庫(kù)系統(tǒng)會(huì)按照索引進(jìn)行排序,這樣就降低了插入記錄的速度,插入大量記錄時(shí)的速度影響會(huì)更加明顯。這種情況下,最好的辦法是先刪除表中的索引,然后插入數(shù)據(jù),插入完成后,再創(chuàng)建索引。
【相關(guān)推薦:mysql視頻教程】