mysql 索引使用總結

2021-09-24 21:51:45 字數 1540 閱讀 5854

select 語句是否用到了索引,可以使用mysql的 explain 來執行後檢視。下面做乙個比較基礎的總結。

normal 普通索引

unique 唯一索引

fulltext 文字索引

alter table t_user add index  idx_name (name);

說下字段的意思:

表示資料來自哪張表

最好到最差的型別:  const , eq_ref,ref,range,index 和all

all: 表示走的全表掃瞄

ref:連線查詢(如left join)不是主鍵或唯一約數的索引(普通索引),根據索引匹配的記錄越少越好

eq_ref :連線查詢(如left join) 使用了主鍵為主鍵或唯一約數的時候 ,如 where user.id = teacher.id 

index : 用在fulltext欄位,

range: 索引範圍,比如 >  ,

in: 測試,使用如下explain select * from t_user  u where u.id in (1,2,3) ,如果1,2,3有記錄,則走range索引,如果 1,2,3其中有乙個沒有對應的資料庫表記錄,則走all ,如果in 其中乙個則使用const,效率最高。

not in :

explain select * from t_user  u where u.id not in (1,2) 

not in  字段(主鍵或唯一約數)如果多條記錄走的all, 如果not in 乙個 則走range索引 

not in  字段(非索引或 普通索引),通過測試後發現,則不管有1個還是多個,都走的all

顯示查詢可能用到的索引(乙個或者多個或為null) ,不一定被查詢實際使用,僅供參考

實際使用的索引字段,如果為null,表示沒有使用索引

索引的長度(位元組數),不丟失精度經情況下,值越小越好

索引哪一列或者常量(const)

表示找到所需記錄需要讀取的行數,值越大越不好

using where: 使用where 過濾

如:explain select * from t_user t where upper(name)='yzy'  不走索引,

explain select * from t_user t where  name='yzy'  走索引

如:explain select * from t_user where name like 'y%';   -- 走range 索引

explain select * from t_user where name like '%y%';   

explain select * from t_user where name is not null;   --  全表掃瞄,type:all

explain select * from t_user where name is null;   -- 走索引,type:ref

explain select * from t_user where (name ='yzy' or pwd='1');    -- 走all,建議少用or

mysql 索引總結 mysql索引總結

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

mysql 索引使用的總結

1 索引字段必須not null,null會使索引失效,因為索引的本質是將字段排序,分割範圍後快速定位。2 盡量在辨識度高的字段上新增索引 型別欄位不建議加索引,乙個值超過總量的30 索引就失效了 例 傳送狀態00 未傳送 01 已傳送,當我們的查詢值關注於00的資料,並且00的資料總是只是少量 不...

mysql次級索引 MySQL 索引總結

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