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引擎。
以上是百萬級資料mysql測試環境介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!