mysql性能優化之max,count優化

注:在執行sql語句前加上explain可以查看mysql的執行計劃
數據庫:mysql官方提供的sakila數據庫

Max優化:

例如:查詢最后支付時間

?explain?select?max(payment_date)?from?payment?G;

mysql性能優化之max,count優化

查詢的類型為simple,沒有用到任何索引,掃描行數為1萬多行,用時0.02sec

優化方法:

在payment_date列建立索引

create?index?idx_paydate?on?payment(payment_date);

然后在執行此sql語句,發現:

mysql性能優化之max,count優化

此執行結果的原因為:因為索引是順序排列的,通過索引,就可以馬上知道最后一個是什么

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優化

注:在執行sql語句前加上explain可以查看mysql的執行計劃
數據庫:mysql官方提供的sakila數據庫

Max優化:

例如:查詢最后支付時間

?explain?select?max(payment_date)?from?payment?G;

mysql性能優化之max,count優化

查詢的類型為simple,沒有用到任何索引,掃描行數為1萬多行,用時0.02sec

優化方法:

在payment_date列建立索引

create?index?idx_paydate?on?payment(payment_date);

然后在執行此sql語句,發現:

mysql性能優化之max,count優化

此執行結果的原因為:因為索引是順序排列的,通過索引,就可以馬上知道最后一個是什么

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優化

?以上就是mysql性能優化之max,count優化的內容,更多相關內容請關注PHP中文網(www.php.cn)!

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享