一、explain
執行後會列印type:all
type有 all(全表掃瞄) index(索引全掃瞄) range(索引範圍掃瞄) ref(非唯一索引掃瞄或唯一索引的字首掃瞄) eq_ref(唯一索引掃瞄) const,system(主鍵或唯一索引unique index查詢) null(mysql不用訪問表就能得到結果 select 1 from dual where 1)
從左往後 效能由最差到最好;下面以索引失效的場景為例分析索引命中
1、建立普通索引create index idx_userid on t_order(user_id);
由於user_id是varchar型別,所以當user_id作為搜尋條件時,需要帶上雙引號,不帶的話會導致索引失效
2、萬用字元like查詢%最左側導致索引失效
3、使用!=、>、《導致索引失效
4、對於組合索引,or查詢將會失效;刪除之前建立的索引,新增個組合索引create index idx_u_p on t_order(user_id,pay_mode); 其中pay_mode是tinyint型別
使用or之後索引變失效了,要想同時用or查詢和索引失效,需要單獨建立user_id和pay_mode索引
5、對於組合索引,不是使用的第一部分則不會使用索引(需參考場景4中建立索引的語句,user_id在pay_mode之前)
由圖可知,user_id觸發了索引,但是pay_mode沒有觸發索引
二、profile
1.檢視profile和開啟
2.通過profile檢視不同儲存引擎執行sql的差別以及每個執行緒消耗的時間,假設查詢的id=7
set @query_id :=7;
select state,sum(duration) as total_r, round( 100 * sum(duration) / (select sum(duration) from information__schema.profiling where query_id = @query_id ),2) as pct_r, count(*) as calls, sum(duration) / count(*) as "r/call" from information_schema.profiling where query_id = @query_id group by state order by total_r desc;
innodb儲存引擎下存在sending data,有訪問資料的過程
myisam下在executing之後直接結束查詢,完全不需要訪問資料
三、通過trace分析優化器如何選擇執行計畫
1.開啟trace 設定格式為json
2.設定trace最大能夠使用的記憶體大小,避免解析過程中因為預設記憶體過小而不能夠完整顯示
3.執行sql語句 檢視mysql是如何執行sql
四、索引問題
1.索引的儲存分類,索引是在儲存引擎層中實現的
①b-tree索引:最常見的索引型別,大部分引擎都支援b樹索引
②hash索引:只有memory引擎支援,使用場景簡單
③r-tree索引(空間索引):是myisam的乙個特殊索引型別,主要用於地理空間資料型別,使用較少
④full-text(全文索引):是myisam的乙個特殊索引型別,主要用於全文索引,innodb從mysql5.6開始提供對全文索引的支援
2.索引的典型場景 索引m(列a,列b,列c)
①匹配全值 a=1 and b=1 and c=1 用到了索引m 型別為const
②匹配值的範圍查詢 c>=1 and c<100 沒有用到索引m 型別為range
③匹配最左字首 b=1 and c=1 不會用到索引m;a=1 and c=1 會用到索引m
④僅僅對索引進行查詢(index only query),當查詢的列都在索引的字段中時,查詢的效率更高 select a from table where a=1 型別為ref
⑤匹配列字首 僅僅使用索引中的第一列,並且只包含索引第一列的開頭一部分進行查詢
create index idx_title_desc_part on filem_text(title(10),description(20))
select title from film_text where title like 'african% '
3.存在索引但不能使用索引的典型場景
①以%開頭的like查詢不能使用b-tree索引
五、資料備份
mysqldump -uroot -p -l -f sakila(庫名) > /usr/local/mysql/backup/sakila-20170730.sql(備份後的檔案位址)
MySQL優化例項
在apache,php,mysql的體系架構中,mysql對於效能的影響最大,也是關鍵的核心部分。對於discuz 論壇程式也是如此,mysql的設定是否合理優化,直接影響到論壇的速度和承載量!同時,mysql也是優化難度最大的乙個部分,不但需要理解一些mysql專業知識,同時還需要長時間的觀察統計...
MySQL優化例項
mysql優化例項 在apache,php,mysql的體系架構中,mysql對於效能的影響最大,也是關鍵的核心部分。對於discuz 論壇程式也是如此,mysql的設定是否合理優化,直接 影響到論壇的速度和承載量!同時,mysql也是優化難度最大的乙個部分,不但需要理解一些mysql專業知識,同時...
mysql優化例項
1.查詢所有欄位的sql耗時 0.003497 秒 2.查詢所需欄位sql耗時 limit 3 0.001194 秒 select group sn,small desc,group name,end time,group image,already orders already orders vi...