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能快速到達乙個...