使用索引的原則sql
使用索引須要注意如下幾點:數據庫
3.在組合索引上要注意最左原則express
咱們想要知道咱們的sql語句寫的好很差,怎麼來判斷?測試
咱們先說下sql語句是怎麼執行的,舉個例子ui
select u.name i.expression from user u left join userinfo i on u.id=i.uid where u.id in (1,3,4,55,67,76) order by u.id limit 10;排序
這條sql語句,會先執行哪一塊? 執行的原理是什麼?索引
select u.name i.expression from user u left join userinfo i on u.id=i.uid where u.id in (1,3,4,55,67,76) order by u.id limit 10;it
sql語句執行的邏輯是這樣的
第一步: 將user表和 userinfo表 作笛卡爾積
1.FROM 子句對其後面的左表user和右表執userinfo行笛卡爾積, 產生虛擬表VT1io
2.ON 子句對VT1中的數據根據ON的條件進行過濾,產生虛擬表VT2
問題:怎麼過濾的?原理
3.JOIN子句 將未符合條件的保留表中的數據添加都VT2中,造成VT3
4.WHERE子句 對VT3中的數據進行WHERE條件過濾,造成VT4
5.GROUP BY 子句對VT4中的數據進行分組操做,而後造成VT5
6.CUBE | ROLLUP 子句進行操做造成VT6
7.HAVING 對VT6中的數據進行HAVING 條件過濾,而後造成VT7
8.SELECT 從VT7中選擇要獲取的字段,而後造成VT8
9.DISTINCT 去重數據,造成VT9
10.ORDER BY 對VT9的結果排序後,造成VT10
11.LIMIT 從VT10中取出指定的數據,造成VT11,返回給用戶
咱們想要知道咱們的sql語句寫的好很差,怎麼來判斷?
方法一: 直接在數據庫上測試,看看執行時間
方法二: explain select xxxx 查看
其中須要關注的幾個參數:type 的值有多個 const:表最多有一個匹配行,const用於比較primary key 或者unique索引。eq_ref:它用在一個索引的全部部分被聯接使用而且索引是UNIQUE或PRIMARY KEY"。eq_ref能夠用於使用=比較帶索引的列。ref 對於每一個來自於前面的表的行組合,全部有匹配索引值的行將從這張表中讀取。range 給定範圍內的檢索,使用一個索引來檢查行。ref列顯示使用哪一個列或常數與key一塊兒從表中選擇行。rows 顯示MYSQL執行查詢的行數,簡單且重要,數值越大越很差,說明沒有用好索引。