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