mysql 索引使用的總結

2021-10-14 11:04:28 字數 1521 閱讀 7082

1、索引字段必須not null,null會使索引失效,因為索引的本質是將字段排序,分割範圍後快速定位。 

2、盡量在辨識度高的字段上新增索引(型別欄位不建議加索引,乙個值超過總量的30% 索引就失效了)

例:傳送狀態00-未傳送 01-已傳送,當我們的查詢值關注於00的資料,並且00的資料總是只是少量(不超過30%)時,我們可以在傳送狀態上加上索引。

3、order by 欄位也要加索引。優先順序在where欄位後面。例:where a=1  order by b 可以用聯合索引 (a,b)

4、使用聯合索引,確定值要在範圍值前面使用。例 where a=1 and  b>0  and b<10

索引失效場景:

1.    如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麼盡量少用or的原因) 例(where a=1  or b=2,此時a有索引也會失效)  

注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引

例:where(a=1 or b=1) a、b都有索引,則整個查詢走索引,a有索引,b沒有索引,則查詢不會走索引

2.對於多列索引,不是使用的第一部分,則不會使用索引(例:聯合索引a,b,c .執行where b=1 不會使用索引)

3.前導模糊查詢不能利用索引(like '%xx'或者like '%xx%')

假如有這樣一列code的值為'aaa','aab','baa','bab' ,如果where code like '%ab'條件,由於前面是

模糊的,所以不能利用索引的順序,必須乙個個去找,看是否滿足條件。這樣會導致全索引掃瞄或者全表掃

描。如果是這樣的條件where code like 'a % ',就可以查詢code中a開頭的code的位置,當碰到b開頭的

資料時,就可以停止查詢了,因為後面的資料一定不滿足要求。這樣就可以利用索引了。

'%3a'   以3a結尾   失效

'3a%'   以3a開頭   生效

mysql sql 中如果使用了 not in , not exists , (<> 不等於 !=) 這些不走

< 小於 > 大於 <= >= 這個根據實際查詢資料來判斷,如果全盤掃瞄速度比索引速度要快則不走索引 

!= 會走範圍索引,效率取決於範圍的大小。

11)對索引列進行運算導致索引失效,我所指的對索引列進行運算包括(+,-,*,/,! 等) 

錯誤的例子:select * from test where id-1=9; 

正確的例子:select * from test where id=10; 

12)使用mysql內部函式導致索引失效.對於這樣情況應當建立基於函式的索引. 

錯誤的例子:select * from test where round(id)=10; 

說明,此時id的索引已經不起作用了 正確的例子:首先建立函式索引, 

create index test_id_fbi_idx on test(round(id)); 

然後 select * from test where round(id)=10; 這時函式索引起作用了

mysql 索引使用總結

select 語句是否用到了索引,可以使用mysql的 explain 來執行後檢視。下面做乙個比較基礎的總結。normal 普通索引 unique 唯一索引 fulltext 文字索引 alter table t user add index idx name name 說下字段的意思 表示資料來...

mysql 索引總結 mysql索引總結

mysql中每乙個表都有乙個聚簇索引clusted index,該所索引是預設建立的,除此之外的表上的每乙個非聚簇索引都是二級索引,又叫輔助索引 secondary indexes 以innodb來說,每個innodb表具有乙個特殊的索引稱為聚集索引,如果您的表上定義有主鍵,該主鍵索引是聚集索引,如...

mysql次級索引 MySQL 索引總結

1 索引是做什麼的?想象一下,你面前有本詞典,資料就是書的正文內容,你就是那個cpu,而索引,則是書的目錄 索引用於快速找出在某個列中有一特定值的行。不使用索引,mysql必須從第1條記錄開始然後讀完整個表直到找出相關的行。表越大,花費的時間越多。如果表中查詢的列有乙個索引,mysql能快速到達乙個...