MySQL索引的學習與使用

2021-09-23 22:08:44 字數 1938 閱讀 6212

最近在做的模組資料量較大,且業務需求全部是查詢,所以嘗試通過新增索引來提公升查詢速度。既然學了就記下吧。

索引可以在很大程度上提公升資料的檢索速度。索引實際上也是一張表,這個表裡會儲存索引字段,並指向實體記錄。mysql只對以下操作符才使用索引:,>=,between,in,以及某些時候的like(不以萬用字元%或_開頭的情形)。而理論上每張表裡面最多可建立16個索引,不過除非是資料量真的很多,否則過多的使用索引也不是最優的選擇。因為使用索引會降低表更新的速度,在我們更新表資料的時候,我們同時還要維護索引資訊,這也會花費一定的時間。另外,索引也會占用物理空間。

mysql的索引型別

1.普通索引,沒有限制。

2.唯一索引(unique),與普通索引不同的是索引列的值必須唯一。

3.主鍵索引,索引列不能為null

4.組合索引,對多列建立索引,遵循最左字首,比如說我對a,b,c三列建立了乙個組合索引,這是會建立3組組合索引,分別為

aa,b

a,b,c

這時我們如果根據a,b查詢則會使用到我們建立的索引,但是根據a,c|b,c查就不會使用索引,因為沒有組合a,c索引,同理,根據c來查也不會用到索引。

5.全文索引(fulltext),對於大容量的資料表,盡量不使用全文索引,不僅耗時還耗磁碟空間。

索引使用注意事項

1、一般資料庫的主鍵欄位會預設被設定為唯一索引。

2、經常被作為搜尋條件的列可以適當新增索引。

3、查詢只使用乙個索引,如果where條件中已經使用了索引,那麼where後面跟的order by不會使用索引。

4、不要在索引做運算,否則會導致索引失效。

5、索引只對以下操作符有效:,>=,between,in,不以萬用字元%或_開頭的like

建立索引

create (不指定/unique/fulltext) index index_name on table(column(length));

例如:為名稱為public_cloud_bill的表中product_detail欄位新增單一索引

create index index_product_detail on public_cloud_bill(product_detail(50));

例如:為名稱為public_cloud_bill的表中bill_cycle、cloud_id、comment1欄位新增復合索引

create index index_billcyle_cloudid_comment1 on public_cloud_bill(bill_cycle,cloud_id,comment1);

刪除索引

drop index index_name on table_name;

例如:刪除名稱為public_cloud_bill的表中名稱為index_product_detail的單一索引

drop index index_product_detail on public_cloud_bill;

檢視表中所有索引

經過大半天的研究學習,我覺得在使用索引的時候,需要注意的是,如果用到復合索引,那麼一定要嚴格遵循最左字首原則,否則我們建的索引可能並不會生效。我是根據我sql的查詢條件順序,建的符合索引,有了索引之後感覺速度會有提公升,因為我現在資料量較小,差不多4000條資料,我測試了一下,加索引之後,速度提公升大約200毫秒吧,後期資料量大的時候會更加明顯。

~又是因為一點小收穫竊喜的一天 (☄⊙ω⊙)☄

mysql 單列索引與聯合索引的使用

col1,col2,col3 分別加索引i1,i2,i3 select from twhere col1 v 用了索引 i1 select from twhere col1 v and col2 v and col3 v 還是只用了索引 i1 select from twhere col2 v an...

mysql強制使用索引與不使用索引

oracle可以強制使用索引來優化那些因為種種原因沒走索引的sql mysql支援嗎?答案是肯定的 mysql強制索引和禁止某個索引 1.mysql強制使用索引 force index 索引名或者主鍵pri 例如 select from table force index pri limit 2 強...

MySQL使用索引與不使用索引比較

首先,我們通過下面的方式生成1百萬條資料。在不建立索引情況下,通過下面的語句查詢age 20的人數 select count 1 from t user where age 20 耗時 1.2s 通過下面的語句檢視執行計畫 explain select count 1 from t user whe...