在MySQL中,普通索引,也就是BTREE索引分兩類,一個是單列索引 另一個是多列索引
1.索引的作用:
當(dāng)一個數(shù)據(jù)表只有很少量的數(shù)據(jù)時,索引體現(xiàn)不了他的價值。但若是一個表有10w多的數(shù)據(jù)時,查找數(shù)據(jù)就要全表查找,最差要查找10w個數(shù)據(jù),太慢了,若是用索引的話,就會大大減少時間,例如對 score字段做一個索引,索引會生成一個文件,查找數(shù)據(jù)就到索引文件中查找,又因為索引出來的數(shù)據(jù)是已經(jīng)排好序的,所以查找時,數(shù)據(jù)庫會用類似二分法的查找,這樣會比不用索引快很多倍。
2.單列索引和多列索引:
一,單列索引:
單列索引是給單個字段做索引,如給math字段。
alter table zje add index math_index( math ); //作用是給 zje表 中的math字段加一個索引,索引名叫 math_index
用命令 show index from zje;可以查看是否建立了索引:
可以看到 存在 math_index 索引的信息建立索引后,我們就要使用索引,索引一般是用于查找信息(用select語句)注意:使用索引時,不能select * ,這樣的話,索引是無法使用的,select后面跟的應(yīng)該包含索引所在的字段,例如上面我設(shè)置了 math字段的索引為 math_index則就要寫成 select math from zje;(selct math,english from zje ;也可以,只要有math字段就行)因為索引生成索引文件,里面放的是索引對應(yīng)字段的數(shù)據(jù)。使用 select math from zje;得出的結(jié)果:
可以看出,數(shù)據(jù)是應(yīng)該排好序的,因為只要是用到索引,被查找后的字段都會被排好序的。刪除索引:alter table zje drop index math_index; //刪除zje表中的 名為 math_index 的索引二,多列索引:多列索引是一個索引對應(yīng)多個字段的數(shù)據(jù)。例如我們想查找 數(shù)學(xué)成績>60 且 英語成績 >60 的學(xué)生。可以用多列索引,當(dāng)然你說用2個單列索引,分別是數(shù)學(xué) 和 英語的索引行不行?其實也是可以的,但也有區(qū)別,下面會講解:創(chuàng)建一個多列索引:alter table zje add index indexes(math,english); //在zje表中創(chuàng)建一個 為名 indexes 的多列索引,包含 math,english字段。感興趣的可以用 show index from zje;查看是否有創(chuàng)建。然后對zje表:select math,english from zje where math>60 and english>60; //在zje表中找出數(shù)學(xué)和英語成績都高于60的數(shù)據(jù)
可以看出,數(shù)據(jù)也是排好序的。接下來介紹 多列索引的一個重要性質(zhì):最左前綴:最左前綴的意思是,例如我創(chuàng)建的多列索引是 (math,english)這樣表示的,則:select math from zje ;select math,english from zje ;上面的寫法都可以使用多列索引,第一行的寫法相當(dāng)于math的單列索引而select english from zje ;則會使用索引失效,因為他不是math開頭刪除多列索引跟刪除單列索引一樣。-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------最后講回一開始的問題,既然多列索引的表現(xiàn)形式跟多設(shè)置幾個單列索引沒什么不同,那為什么還要有多列索引呢?因為即使設(shè)置了多個單列索引,但是數(shù)據(jù)庫在搜索數(shù)據(jù)時,會挑出一個最嚴(yán)格的索引使用,其二是一個表中,索引是越少越好的
新聞熱點
疑難解答