MySQL單列索引和組合索引的區(qū)別詳解

MySQL單列索引和組合索引的區(qū)別詳解

MyS

MySQL單列索引和組合索引的區(qū)別

MyS

什么是索引?索引類型有幾種,各有什么特點?

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

組合索引,即一個索引包含多個列。

創(chuàng)建索引時,你需要確保該索引是應(yīng)用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。實際上,索引也是一張表,該表保存了主鍵與索引字段,并指向?qū)嶓w表的記錄。上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。

因為更新表時,MySQL不僅要保存數(shù)據(jù),還要保存一下索引文件。建立索引會占用磁盤空間的索引文件。

單列索引與聯(lián)合索引

一般在創(chuàng)建數(shù)據(jù)表的時候,就會根據(jù)表的業(yè)務(wù)屬性,對查詢比較頻繁的字段建立索引,方便提高查詢速度。如果該表存在多個字段查詢頻繁,是該建立多個單列索引還是創(chuàng)建一個多列聯(lián)合索引呢? 簡單來說,索引就是一個指針,指向表里的數(shù)據(jù)。

索引通常與相應(yīng)的表時分開保存的,目的是提高檢索的性能。

索引的創(chuàng)建與刪除不會影響數(shù)據(jù)本身,但會影響數(shù)據(jù)檢索的速度。索引也會占據(jù)物理存儲空間,可能比表本身還大,因此創(chuàng)建索引也要考慮存儲空間。 如果某個字段經(jīng)常在where子句作為單獨的查詢條件,它的單列索引最為有效。單列索引是最簡單常見的索引,基于一個字段創(chuàng)建。

**索引用于改善性能和保證數(shù)據(jù)完整性,不允許表里有重復(fù)值百科,其他和普通單列索引一樣。允許NULL值的字段不能創(chuàng)建**索引。 聯(lián)合索引基于一個表中的多個字段的索引。

聯(lián)合索引中即使字段一樣,但順序不同,也屬于不同的聯(lián)合索引,查詢速度也不同。 1、針對索引字段stu_id查詢,聯(lián)合索引有效 2、針對索引字段name查詢,聯(lián)合索引無效 3、針對索引字段phone查詢,聯(lián)合索引無效 4、針對索引字段stu_id和phone查詢,聯(lián)合索引有效 5、針對索引字段stu_id和name查詢,聯(lián)合索引有效 6、針對索引字段phone和name查詢,聯(lián)合索引無效 7、針對索引字段phone、name、stu_id查詢,聯(lián)合索引有效 8、針對索引字段stu_id、name查詢,不是and,是or,聯(lián)合索引無效 刪除掉聯(lián)合索引,分別給stu_id、name、phone創(chuàng)建單列索引 1、針對索引字段stu_id查詢,學(xué)號索引有效 2、針對索引字段name查詢,姓名索引有效 3、針對索引字段phone查詢,電話索引有效 4、針對索引字段stu_id、phone查詢,學(xué)號索引有效,電話索引無效 5、針對索引字段stu_id、phone查詢,學(xué)號索引有效,電話索引無效(跟where后面的條件順序無關(guān)) 6、針對索引字段stu_id、phone、name查詢,學(xué)號索引有效,電話索引無效、姓名索引無效 7、針對索引字段phone、name查詢,or關(guān)系,姓名索引、電話索引均無效 1、創(chuàng)建聯(lián)合索引時,要考慮列的順序,如果使用前幾列查詢,聯(lián)合索引有效,后幾列查詢,聯(lián)合索引無效。 2、聯(lián)合索引使用最左前綴原則,例如A,B兩個字段都會在查詢中用到,但A使用的頻率更高,就將A作為聯(lián)合索引的**個字段,放在最左邊。

3、當(dāng)存在多個單列索引可以用時,mysql會根據(jù)查詢優(yōu)化策略選擇其中一個單列索引,并不是每個單列索引都生效。 4、當(dāng)同時存在單列索引和聯(lián)合索引,mysql會根據(jù)查詢優(yōu)化策略選擇其中一個索引。 5、如果where中的關(guān)系是or,索引不生效。

MySQL單列索引和組合索引的區(qū)別介紹

聯(lián)合索引是由多個字段組成的索引。CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name[USING index_type]ON tbl_name (index_col_name,…)index_col_name:col_name [(length)] [ASC | DESC] 如果你經(jīng)常要用到多個字段的多條件查詢,可以考慮建立聯(lián)合索引,一般是除**個字段外的其它字段不經(jīng)常用于條件篩選情況,比如說a,b 兩個字段,如果你經(jīng)常用a條件或者a+b條件去查詢,而很少單獨用b條件查詢,那么可以建立a,b的聯(lián)合索引。

如果a和b都要分別經(jīng)常獨立的被用作查詢條件,那還是建立多個單列索引。