答:1.表列型別與where值型別不一致;
2.join表的字元編碼不同時;
第一類:「列型別」與「where型別」的值型別不一致,不能命中索引,會全表掃瞄
如create table t1(
celll varchar(3) primary key
)engine = innodb default charset=utf8;
新增資料:
insert into t1 (cell) values ('111'),('222'),('333');
資料分析:
1)cell列屬性型別是varchar型別;
2)cell為主鍵,即是聚簇索引
測試語句:
語句1:select cell from t1 where cell=111;
語句2:select cell from t1 where cell='111';
測試結論:
第一句:where後的值型別是整數(與列屬性不一樣)
mysql在執行語句的時,進行了強制了型別轉換,沒命中索引,進行全表掃瞄
第二句:where後值型別是字串(與列屬性一樣)
型別相同,命中索引,一條記錄
第二類,相join的兩張表的字元編碼不同,不能命中索引
create table t2(
celll varchar(3) primary key
)engine = innodb default charset=latin1;
新增資料:
insert into t2 (cell) values ('111'),('222'),('333'),('444'),('555'),('666');
create table t3(
celll varchar(3) primary key
)engine = innodb default charset=utf8;
新增資料:
insert into t3 (cell) values ('111'),('222'),('333'),('444'),('555'),('666');
資料分析:
1)t2和t1字符集不同;
2)t3和t1字符集相同;
3)t1,t2,t3表結構完全相同
測試語句:
語句1:select * from t1,t2 where t1.cell=t2.cell;
語句2:select * from t1,t3 where t1.cell= t3.cell;
測試結論:
1:連表t1和t2(字符集不同),關聯屬性是cell
t1和t2字符集不同,儲存空間不同。t1和t2相join時,遍歷了t1表中的所有記錄,t1
的每一條記錄又要遍歷t2的所有記錄,實際上就是進行笛卡爾積循壞計算,索引無效;
2:連表t1和t3(字符集相同),關聯屬性是cell
t1和t3相join時,遍歷了t1的所有記錄,t1的每一條記錄使用t3索引,即掃瞄1行記錄
學習架構師之路
索引失效的情況有哪些?索引何時會失效?
雖然你這列上建了索引,查詢條件也是索引列,但最終執行計畫沒有走它的索引。下面是引起這種問題的幾個關鍵點。某個表中,有兩列 id和c id 都建了單獨索引,下面這種查詢條件不會走索引 select from test where id c id 這種情況會被認為還不如走全表掃瞄。我們在設計資料庫表時,...
mysql的索引有哪些?
廢話不多說直接介紹 普通索引 index 普通索引,資料可以重複,沒有任何限制。唯一索引 unique 唯一索引,要求索引列的值必須唯一,但允許有空值 如果是組合索引,那麼列值的組合必須唯一。主鍵索引 primary key 主鍵索引,是一種特殊的唯一索引,乙個表只能有乙個主鍵,不允許有空值,一般是...
Mysql索引查詢失效的情況
首先,複習一下索引的建立 普通的索引的建立 create index 自定義 索引名 on 資料表 字段 復合索引的建立 create index 自定義 索引名 on 資料表 字段,字段,刪除索引 drop index 索引名 以下通過explain顯示出mysql執行的字段內容 索引查詢失效的幾...