Mysql索引和性能優化

使用索引的原則sql

  1. 若是沒有惟一性要求,能夠選擇普通索引
  2. 若是列上有惟一性要求,能夠選擇惟一索引
  3. 若是是須要模糊搜索,建議選擇全文索引
  4. 若是有多個條件一塊兒查詢,能夠選擇組合索引

使用索引須要注意如下幾點:數據庫

  1. 按需使用索引
  2. 索引所在的列基數越大越好 , 男女這種字段創建索引的效果並不大 ,基數很小

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執行查詢的行數,簡單且重要,數值越大越很差,說明沒有用好索引。

相關文章
相關標籤/搜索