索引知識點補充
阿新 • • 發佈:2017-06-23
目的 exe row 訪問 分享 exp 反轉 下使用 比例
OFF 為未打開。使用下面語句打開:
具體要分析的東西等碰到了詳細學習。
一、索引中包含like關鍵字
- 在索引列上使用like該列會不會使用到索引?
- 在聯合索引上前面索引字段使用like之後後面的列上會不會用到索引?
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執行結果如下:沒有用到索引‘%zz‘and age = 1;
二、優化sql語句的過程
- profile的使用(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)
- 執行SQL語句:SELECT A.a,A.c FROM A;查出來的結果不妨記為:A_rows
- 執行SQL語句:SELECT B.b FROM B WHERE B.c = A_rows.c
- 然後返回查詢中的各個列。
四、索引經驗總結
1、如果查詢的數據量比較大,MySQL可能會優化為不用索引,也就是說,查詢的數據量過多時,不適用用索引。 2、什麽情況下使用全表掃描要比使用索引快?? 查詢結果的記錄數量小於表中記錄一定比例的時候。這個主要是由於索引掃描後要利用索引中的指針去逐一訪問記錄,假設每個記錄都使用索引訪問,則讀取磁盤的次數是查詢包含的記錄數T,而如果表掃描則讀取磁盤的次數是存儲記錄的塊數B,如果T>B 的話索引就沒有優勢了。對於大多數數據庫來說,這個比例是10%(oracle,postgresql等),即先對結果數量估算,如果小於這個比例用索引,大於的話即直接表掃描。索引知識點補充