【階段性總結】MySQL經常使用優化

    這份優化總結醞釀了有段時間了,主要始從本身目前在帶領的一個項目當中吸收的、經歷的,以及從本身瞭解到的一些實用的mysql語句或者設計方面的優化方案,特別是sql語句的書寫方面。mysql

    話很少說,直接開始。sql

    1、語句優化數據庫

    一、select時儘可能不要用*。須要什麼字段、多少字段則寫多少。若是使用*,數據庫還須要在執行完語句以後進行字段的轉換。函數

    二、普通狀況下少用group by。group by在表數據很大,幾十萬就開始表現出緩慢,幾百萬或者上千萬則會達到十秒以上的緩慢(具體要視語句而定);通常能夠經過關聯查詢或者distinct來代替一下,若是非要用group by,能夠考慮對分組的字段添加索引。性能

    三、善用limit。limit的實用更可能是在分頁中使用,這裏延生一種使用方式是:在查詢結果明確了爲一條或者只想獲取第一條記錄的話,能夠加入 「limit 1」,不須要查詢出來再get第一條記錄。limit 1在查詢到第一條記錄後會中止查詢,提升查詢效率。優化

    四、靈活運用exist和in、not exist和not in 兩組關鍵字。不深刻討論,簡單的說一下使用場景:設計

        exist和in:假設有兩個待查詢的表,若是兩個表的數據量相差不大,那麼用in和exists差異不大;若是兩個表中數據量一個較小一個較大,則子查詢表大的用exists,子查詢表小的用in;blog

        not exsit 和 not in:用not exsit 老是比 not in效率高。排序

    五、查詢字段爲空的條件時,注意查詢 is not null 和 != '' 的結合使用,前者是查詢數據庫值不爲數據庫NULL 的,後者是查詢內容不爲空的;特別是列表查詢反選查詢不爲空的條件時,這兩個都要加上。繼承

      六、多用函數。MySQL的函數方法很是多,包括運算函數、操做函數等,平常的業務使用中,字符拼接、數量計算、字符截取、日期時間格式化、case when 、if 和 ifNull等等,都能在數據操做這一層面解決,能夠減小頁面標籤或其餘應用端的再度轉換。

    七、用order by field 自定義排序。將查詢後的結果(注意是:結果,例如 as 以後的別名),按照自定義的排序。簡例:SELECT CANCAT(my_level,'級') as level FROM my_info WHERE sex = 1 ORDER BY FIELD(level,'0級','1級','2級','3級','4級','5級') ASC 。

    2、結構優化

    一、選擇合適的引擎。幾個經常使用的MySQL數據引擎要知道,例如最經常使用的InnoDB 和 MyISAM 。若是寫或改數據都是平常操做,則選用InnoDB,由於Inn DB有事務操做,整體來講性能比較綜合;但若是在讀寫分離的多數據庫狀況下,讀的數據庫最好採用My ISAM,由於MyISAM 沒有事務的概念,在搜索和檢索方面倒是強化了的。

    二、利用索引。索引是雙刃劍,用得好能大幅度提升效率,用得很差會阻塞數據庫;通常來講,讀取或查詢較多、字符串字段、非NULL的字段的有利於索引的應用。

    三、用上存儲過程和觸發器。存儲過程、觸發器能在數據的增查改上很好的改善數據聯動,並不是數據的改動上都須要動用到代碼層。例如某一字段的變更,會單純觸發其餘表格的字段變更,則能夠用上觸發器,能夠不使用代碼定時器來處理。例如對某一相似的列表進行查詢,會返回不一樣的結果字段但總體結構類似,可使用存儲過程。

    3、Tips

    一、在對SQL語句有疑惑或者功能語句存在多種解決方案的狀況下,可使用DESC 關鍵字對SQL 語句進行分析,查看SQL的語句性能、是否利用到索引等分析,從而進一步瞭解如何優化SQL。

    例:如圖

    

二、在Java中,能夠對幾個通用的字段進行提煉,例如建立時間、主鍵、更新時間等,做爲BaseEntity,而後全部須要到這些字段的都繼承該實體

 

TO BE CONTINUE ...

相關文章
相關標籤/搜索