程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 百萬級SQL優化總結

百萬級SQL優化總結

編輯:MySQL綜合教程

百萬級SQL優化總結   1:基本環境 1:數據庫:Mysql 2:表結構 3:數據數量:500+萬 2:目的 2.1:原始Sql語句        selectzero_dateline,sum(item_amount) as `sum` from c_log_item where item_id in(11400019,12400199,11400018) and zero_dateline between '1361116800' and'1363535999' and item_amount>0 group by zero_dateline order by zero_datelineasc 花費 3:思考 3.1:in 網上說in的速度很慢,用上in就不能用索引,慢是對,但是關於in不能使用索引這個是錯誤的. 有的說用exists來代替,也有的說用join來代替.我找到網上一種我比較贊同的原話 IN適合於外表大而內表小的情況;EXISTS適合於外表小而內表大的情況。 總之,這個in是可以進行優化的 3.2關於索引        索引是提高數據查詢的必備神器.高性能Mysql曾經提到過很多關於Sql正確的使用索引方法,因為一些Sql語句的不正確也會導致Sql不會運行.其中有一條就是:當多個條件時,不會全部使用索引,對於這條語句而言,即使分別為各個字段建索引,也不會使用到,因此應該使用復合索引.另外,在使用普通查詢時可以在select前面加上explain命令,這個命令可以查看用到的索引,以及級別. 用之前那條sql查詢時,使用的索引是zero_dateline,並且type的級別為index. Type級別由高到低為: system >const > eq_ref > ref > fulltext > ref_or_null > index_merge >unique_subquery > index_subquery > range > index > ALL 最壞的情況就是All.這個就是沒有使用索引,而導致的全表掃描. 網上提示至少要保證sql在range級別以上.所以關於索引,這部分也可以優化. 4:結論       兩者結合就是 1:添加聯合索引:   ALTER TABLE c_log_item ADD INDEXzero_item(item_id,item_amount,zero_dateline); 2:修改sql語句為: select`zero_dateline`,sum(`item_amount`) as `sum` from(select`zero_dateline`,`item_amount` from `c_log_item` where `item_id` in(11400019,12400199,11400018)) as newTable where `zero_dateline` between'1361116800' and  '1363535999' and`item_amount`>0 group by `zero_dateline` order by `zero_dateline` asc; 結果顯示: 使用 Type級別:range 5:總結:        有的說in不好,但是我覺得應該因地制宜.如之前紅色字所說,外表大,內表小的時候用in.當僅僅使用in的時候表的數據為2w左右,當使用item_amount的時候,數據量為20W+,當僅僅使用zero_dateline的時候,數據量為300萬,因此,這樣的方式使用in是不錯的.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved