乙個文章庫,裡面有兩個表:category和article, category裡面有10條分類資料,article裡面有 20萬條。
article裡面有乙個"article_category"欄位是與category裡的"category_id"字段相對應的。
article表裡面已經把 article_category字義為了索引。
資料庫大小為1.3g。
問題描述:
執行乙個很普通的查詢:
select * from article where article_category=11 order by article_id desc limit 5 , 執行時間大約要5秒左右
解決方案:
建乙個索引:create index idx_u on article (article_category,article_id);
select * from article where article_category=11 order by article_id desc limit 5 減少到0.0027秒.
又有問題:
上面這兩個問題的時間基本差不多。
優化方案: 避免使用 in 或者 or ( or會導致掃表),使用 union all 來替換它們,如下:
(select * from article where article_category=2 order by article_id desc limit 5)
union all (select * from article where article_category=3 order by article_id desc limit 5)
order by article_id desc limit 5
從效率上說,union all 要比union快很多,所以,如果可以確認合併的兩個結果集中不包含重複資料且不需要排序時的話,那麼就使用union all
很多時候用 exists 代替 in 是乙個好的選擇:select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists ( select num from b where num = a.num )
mysql演算法優化原則 MYSQL的索引優化
當乙個表的資料量較大時,我們需要對這個表做優化,除了分表分庫以外,最常見的就是索引優化了,那做索引優化的原則是什麼呢?在不考慮排序,分組時,也就是sql語句中只有where的時候,多列並查如 select from payment where staff id and customer id 的索引...
mysql 索引等 mysql索引
一 什麼是索引?為什麼要建立索引?索引用於快速找出在某個列中有一特定值的行,不使用索引,mysql必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢資料所花費的時間就越多,如果表中查詢的列有乙個索引,mysql能夠快速到達乙個位置去搜尋資料檔案,而不必檢視所有資料,那麼將會節省很大一部分...
MySQL慢查詢優化 索引優化 以及表等優化總結
mysql資料庫常見的兩個瓶頸是 cpu和i o的瓶頸。cpu在飽和的時候一般發生在資料裝入記憶體或從磁碟上讀取資料時候。磁碟i o瓶頸發生在裝入資料遠大於記憶體容量的時候,如果應用分布在網路上,那麼查詢量相當大的時候那麼平瓶頸就會出現在網路上。我們可以用mpstat,iostat,sar和vmst...