不走索引的SQL
- like語句,'%w'不會使用索引,'w%'會使用索引
select * from table_name where name LIKE "%wang%"; -----------------不會使用索引
select * from table_name where name LIKE "wang%"; ------------------會使用索引
- 列類型為字符串類型字符串類型指(CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET),查詢時沒有用單引號引起來
select * from table_name where ship_id=20; -----------------不會使用索引
select * from table_name where ship_id="20"; ------------------會使用索
- 在where查詢語句中使用計算試+-*/或是!= , <> 比較
select * from table_name where id +1 = 2103;-----------------不會使用索引
- 在where查詢語句中對字段進行NULL值判斷(is NULL 或is not NULL)
select * from table_name where group_name=NULL; -----------------不會使用索引
- 在where查詢中使用了or關鍵字, myisam表能用到索引, innodb不行;(用UNION替換or,可以使用索引)
例:where中的indexed欄有建索引、no_index欄沒建索引。
select * from table_name where Indexed="20" or No_index="11";--不會使用索引(一有一沒有建)
select * from table_name where Indexed="20" or Indexed2="11";----會使用索引(兩個都有建)
- where中組合索引未按順序查詢的index(A欄,B欄,C欄)左前綴法則
- 但查A,C欄雖有使用到索引,效果沒有ABC來得好,因為只使用到部份索引
select * from table_name where B欄="小熊" and C欄="小Q";--不會使用索引(一定要A欄先)
select * from table_name where A欄="小胖" and C欄="小Q";----會使用索引(A欄有在第一個就可)
- 如果mysql估計使用全表掃描要比使用索引快,則不使用索引(數據量小時or 索引數據量大於20%的
- delete中帶in不會走索引
(查詢table_name2中的id=20符合的,刪除在table_name的資料)
delete from table_name where id in(select id from table_name2 where id=20);--不會使用索引
delete table_name from table_name inner join table_name2 on
table_name.id=table_name2.id where table_name2=20;--------會使用索引
沒有留言:
張貼留言