1,explain查詢分析
1)
explain select sql\G;查看執行計劃
image.png
id :值越大,優先級越高,越先被執行, 如果相同,從上而下執行;
select type :查詢的類型 PRIMARY、SIMPLE、DERIVED
type :訪問類型。ALL(全表掃描) index(遍歷索引樹) ref(非唯一性索引掃描)等。
possible_keys :該查詢可能使用哪些索引。
key :mysql 實際使用了哪一個索引來優化對該表的訪問。
key_len:是根據表定義算出來的,和具體數據無關。在索引中使用的字節數。
ref :表的連接匹配條件。
rows :估算的要找出結果需要讀取的記錄行數。
Extra :using index( select 操作中使用了覆蓋索引)、using where(結果集進行過濾)、using temporary(使用臨時表來存儲結果集)、using filesort(無法利用索引完成的排序)
`
2,count查詢優化
1)count(*) 統計結果集的行數。
count(column) :統計column不為空的數量,所以字段通常非空,切有默認值。
2)where條件, 會嚴重影響count的效率,即使是where 1 = 1
3)count( *)~count(pk) > count(index col) > count(col)
3,order by優化
數據庫底層只進行I/O操作,無法進行排序,需要借助磁盤或者內存。
1)使用order by會出現using filesort,只要用到order by的這一列都應該為其建立一個索引。
alter table tb_course_info add index idx_stm(startTime);
2)mysql inner join的時候,使用嵌套循環,小表作為驅動表。這時候,使用order by會進行using filesort,因為inner join會產生臨時表,是無法使用索引的。可以使用from字句,排好序之后,再進行inner join,from也可以使用視圖代替。