mysql 作為一款非常優秀的免費數據庫被廣泛的使用,平時我們開發的項目數據過百萬的時候不多。最近花了大量的時間來深入的研究mysql百萬級數據情況下的優化。 遇到了很多問題并解決了他們,特此分享給大家。歡迎提出您的寶貴意見!
相關推薦:《MySQL教程》
測試環境
數據總數 300萬條 占用磁盤空間 1G 左右
數據結構
表1?news?[?文章表?引擎?myisam?字符集?utf-8?] ----------------------------------------------------- idint11主鍵自動增加 cateint11索引 titlevarchar200標題(便于基礎搜索做了索引) contenttext文章正文 dateint11文章發布時間(時間戳形式)
表2?cate?[?文章分類表?引擎?myisam?字符集?utf-8?] ----------------------------------------------------- cate_idint11主鍵自動增加 cate_namevarchar200文章標題
查詢總數
myIsam?引擎下 select?count(*)?as?total?from?news //耗時?0.001秒?極快? //帶上條件 select?count(*)?as?total?from?news?where?cate?=?1 耗時?0.046秒?可以接受的速度 innodb?引擎下 select?count(*)?as?total?from?news //耗時?0.7秒?很慢 select?count(*)?as?total?from?news?where?cate?=?1 耗時?0.7秒?很慢
為什么2種引擎查詢速度相差這么大?
InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行。
MyISAM只要簡單的讀出保存好的行數即可。
注意的是,當count(*)語句包含 where條件時,兩種表的操作有些不同,InnoDB類型的表用count(*)或者count(主鍵),加上where col 條件。其中col列是表的主鍵之外的其他具有唯一約束索引的列。這樣查詢時速度會很快。就是可以避免全表掃描。
總結
mysql 在300萬條數據(myisam引擎)情況下使用 count(*) 進行數據總數查詢包含條件(正確設置索引)運行時間正常。對于經常進行讀取的數據我們建議使用myIsam引擎。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦