接續上一節《百萬資料mysql分頁問題》,我們加上查詢條件:
select id from news where cate = 1 order by id desc limit 500000 ,10 查询时间 20 秒
好恐怖的速度! !利用第一節《百萬資料mysql資料測試環境介紹》知識進行最佳化:
select * from news where cate = 1 and id > (select id from news where cate = 1 order by id desc limit 500000,1 ) order by id desc limit 0,10 查询时间 15 秒
最佳化效果不明顯,條件帶來的影響還是很大!在這樣的情況下無論我們怎麼去優化sql語句就無法解決運行效率問題。那麼換個思路:建立一個索引表,只記錄文章的id、分類信息,我們將文章內容這個大字段分割出去。
表 news2 [ 文章表 引擎 myisam 字符集 utf-8 ] ------------------------------------------------- idint11主键自动增加 cateint11索引
在寫入資料時將2張表同步,查詢是則可以使用news2 來進行條件查詢:
select * from news where cate = 1 and id > (select id from news2 where cate = 1 order by id desc limit 500000,1 ) order by id desc limit 0,10
注意條件 id > 後面使用了news2 這張表!
運行時間 1.23秒,我們可以看到運行時間縮減了近20倍! !資料在10萬左右是查詢時間可以維持在0.5秒左右,是一個逐步接近我們所能容忍的值!
但是1秒對伺服器來說還是一個不能接受的值! !還有什麼可以優化的方法嗎? ?我們嘗試了一個偉大的變化:
將 news2 的儲存引擎改為innodb,執行結果是驚人的!
select * from news where cate = 1 and id > (select id from news2 where cate = 1 order by id desc limit 500000,1 ) order by id desc limit 0,10
只需要 0.2秒,非常棒的速度。為什麼會有怎麼大的差異呢?請觀看下一篇 mysql儲存引擎詳解。
以上是百萬資料下mysql條件查詢及分頁查詢的注意事項的詳細內容。更多資訊請關注PHP中文網其他相關文章!