1. 程式人生 > >索引知識點補充

索引知識點補充

目的 exe row 訪問 分享 exp 反轉 下使用 比例

一、索引中包含like關鍵字

  • 在索引列上使用like該列會不會使用到索引?
  • 在聯合索引上前面索引字段使用like之後後面的列上會不會用到索引?
如果索引字段上使用 like ‘%xxx‘,這種不會用到索引,後面的索引也不會用到,如果格式為 like ‘xxx%‘,這種可以用到索引,而且不影響後面的索引使用。 對於某些訂單號比較長的,在使用的時候可能會反轉一下用到索引,因為輸入單號的後幾位比較符合使用習慣。反轉的目的就是可以用到索引。 舉例如下: 對於user表,索引列為(name,age),依次執行下面的語句: 1、like ‘xxx%‘格式:可以用到索引
explain select
* from user where name like ab%
執行結果如下:使用到了索引 技術分享 後面如果有其它索引也是沒有問題的
explain select * from user where name like zz%and age = 1;
技術分享 2、like ‘%xxx‘格式:不會用到索引
explain select * from user where name like %zz;
技術分享 後面如果有其它索引也不會用到
explain select * from user where name like
%zzand age = 1;
執行結果如下:沒有用到索引 技術分享

二、優化sql語句的過程

  • profile的使用(profile:個人資料)
1、查看profile是否打開
show variables like %profil%;
顯示如下: 技術分享

OFF 為未打開。使用下面語句打開:
set profiling = 1;
2.、執行sql語句之後,執行查詢語句:
show profile for query 1;
顯示如下: 技術分享 其中:紅框裏面的比較重要,左面是執行中的一個節點,右面是該過程耗時
含義
optimizing 優化
statistics 統計
preparing 準備
executing 執行
Sending data 發送數據
具體要分析的東西等碰到了詳細學習。

三、MySQL如何執行關聯查詢

對於下面的連接查詢,MySQL執行步驟
SELECT A.a,B.b FROM A INNER JOIN B ON A.c = B.c;
MySQL對任何關聯查詢都執行嵌套循環關聯操作,即MySQL先在一個表中循環取出單條數據,然後再嵌套到下一個表中尋找匹配的行,依次下去,直到找到所有表中匹配的行為止。然後根據各個表匹配的行,返回查詢中需要的各個列。 結合上面的例子,執行步驟如下:(假設優化器優化的關聯順序為A,B)
  1. 執行SQL語句:SELECT A.a,A.c FROM A;查出來的結果不妨記為:A_rows
  2. 執行SQL語句:SELECT B.b FROM B WHERE B.c = A_rows.c
  3. 然後返回查詢中的各個列。

四、索引經驗總結

1、如果查詢的數據量比較大,MySQL可能會優化為不用索引,也就是說,查詢的數據量過多時,不適用用索引。 2、什麽情況下使用全表掃描要比使用索引快?? 查詢結果的記錄數量小於表中記錄一定比例的時候。這個主要是由於索引掃描後要利用索引中的指針去逐一訪問記錄,假設每個記錄都使用索引訪問,則讀取磁盤的次數是查詢包含的記錄數T,而如果表掃描則讀取磁盤的次數是存儲記錄的塊數B,如果T>B 的話索引就沒有優勢了。對於大多數數據庫來說,這個比例是10%(oracle,postgresql等),即先對結果數量估算,如果小於這個比例用索引,大於的話即直接表掃描。

索引知識點補充