2019年3月27日 星期三

【MYSQL】不走索引的SQL

不走索引的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;--------會使用索引

沒有留言:

張貼留言