最佳化暫存資料表使用,SQL語句效能提升100倍

來源:互聯網
上載者:User

SQL語句如下:
SELECT DISTINCT cp.name AS cp_name, c.name AS category_name, t.name AS type_name FROM g LEFT JOIN  cp ON cp.id = g.cp_id AND cp.deleted = 0 LEFT JOIN  c ON c.id = g.category_id AND c.deleted = 0 LEFT JOIN  t ON t.id = g.type_id AND t.deleted = 0 WHERE g.deleted = 0 ORDER BY g.modify_time DESC LIMIT 20 ;

DBA觀察到的IO高,是因為sql語句產生了一個巨大的暫存資料表,記憶體放不下,於是全部拷貝到磁碟,導致IO飆升。

第一條語句:查詢合格資料,只需要查詢g.id即可
SELECT DISTINCT FROM  g LEFT JOIN  cp ON cp.id = g.cp_id AND cp.deleted = 0 LEFT JOIN  c ON c.id = g.category_id AND c.deleted = 0 LEFT JOIN  t ON t.id = g.type_id AND t.deleted = 0 WHERE g.deleted = 0 ORDER BY g.modify_time DESC LIMIT 20 ;

 g LEFT JOIN  cp ON cp.id = g.cp_id AND cp.deleted = 0 LEFT JOIN  c ON c.id = g.category_id AND c.deleted = 0 LEFT JOIN  t ON t.id = g.type_id AND t.deleted = 0 WHERE g.deleted = 0 and g.id in(…………………) ORDER BY g.modify_time DESC ;

在SSD機器上測試,最佳化前大約需要7s,最佳化後第一條0.3s,第二條0.1s,最佳化後
可以看出,最佳化前磁碟io是效能瓶頸,SSD的速度要比SATA明顯要快,最佳化後磁碟不再是瓶頸,SSD和SATA效能沒有差別。

    Linux平台上預設是/tmp目錄,/tmp目錄小的系統要注意啦。

        3)使用UNION或者UNION ALL時,SELECT子句中包含大於512位元組的列;

            2)分拆很長的列:一般情況下,TEXT、BLOB,大於512位元組的字串,基本上都是為了顯示資訊,而不會用於查詢條件, 因此表設計的時候,應該將這些列獨立到另外一張表。

              1)拆分SQL語句
              暫存資料表主要是用於排序和分組,很多業務都是要求排序後再取出詳細的分頁資料,這種情況下可以將排序和取出詳細資料拆分成不同的SQL,以降低排序或分組時暫存資料表的大小,提升排序和分組的效率,我們的案例就是採用這種方法。
              2)最佳化業務,去掉排序分組等操作
              有時候業務其實並不需要排序或分組,僅僅是為了好看或者閱讀方便而進行了排序,例如資料匯出、資料查詢等操作,這種情況下去掉排序和分組對業務也沒有多大影響。


                相關文章

                A Free Trial That Lets You Build Big!

                Start building with 50+ products and up to 12 months usage for Elastic Compute Service

                • Sales Support

                  1 on 1 presale consultation

                • After-Sales Support

                  24/7 Technical Support 6 Free Tickets per Quarter Faster Response

                • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.