注:在執行sql語句前加上explain可以查看mysql的執行計劃
數據庫:mysql官方提供的sakila數據庫
Max優化:
例如:查詢最后支付時間
?explain?select?max(payment_date)?from?payment?G;
查詢的類型為simple,沒有用到任何索引,掃描行數為1萬多行,用時0.02sec
優化方法:
在payment_date列建立索引
create?index?idx_paydate?on?payment(payment_date);
然后在執行此sql語句,發現:
此執行結果的原因為:因為索引是順序排列的,通過索引,就可以馬上知道最后一個是什么
Count優化
例如:在一條SQL語句中同時查出2006年和2007年的電影數量分別是多少
錯誤方式:
select?count(release_year?=?'2006'?OR?release_year?=?'2007')?from?film;
無法分開計算2006年和2007年的電影數量
select?count(*)?from?film?where?release_year?=?'2006'?and?release_year?=?'2007'
release_year不能同時為2006和2007,因此邏輯上有誤
查詢優化如下:
select?count(release_year='2006'?or?null)?as?'2006年的電影數量',count(release_year='2007'?or?null)?as?'2007年的電影數量'?from?film;
說明,在sql中,count(*)和count(某列),執行結果有時候會是不一樣的,因為,count(*)包含為null的,而另個如果為null的話,則不計數在內。
利用這個特性,將為不是2006年的記為null,執行結果如下圖所示
注:在執行sql語句前加上explain可以查看mysql的執行計劃
數據庫:mysql官方提供的sakila數據庫
Max優化:
例如:查詢最后支付時間
?explain?select?max(payment_date)?from?payment?G;
查詢的類型為simple,沒有用到任何索引,掃描行數為1萬多行,用時0.02sec
優化方法:
在payment_date列建立索引
create?index?idx_paydate?on?payment(payment_date);
然后在執行此sql語句,發現:
此執行結果的原因為:因為索引是順序排列的,通過索引,就可以馬上知道最后一個是什么
Count優化
例如:在一條SQL語句中同時查出2006年和2007年的電影數量分別是多少
錯誤方式:
select?count(release_year?=?'2006'?OR?release_year?=?'2007')?from?film;
無法分開計算2006年和2007年的電影數量
select?count(*)?from?film?where?release_year?=?'2006'?and?release_year?=?'2007'
release_year不能同時為2006和2007,因此邏輯上有誤
查詢優化如下:
select?count(release_year='2006'?or?null)?as?'2006年的電影數量',count(release_year='2007'?or?null)?as?'2007年的電影數量'?from?film;
說明,在sql中,count(*)和count(某列),執行結果有時候會是不一樣的,因為,count(*)包含為null的,而另個如果為null的話,則不計數在內。
利用這個特性,將為不是2006年的記為null,執行結果如下圖所示
?以上就是mysql性能優化之max,count優化的內容,更多相關內容請關注PHP中文網(www.php.cn)!