原標題:我在 MySQL 上作了哪些優化
原文連接:zhoupq.com/我在-MySQL-上作…
轉載請註明出處mysql
本文記錄了我這一年的時間裏是如何對項目中用到的 MySQL 進行優化。帶有必定的主觀性和侷限性,請各位支持的同時,不吝賜教。
算法
若是你跟我同樣不幸,不只選擇了 Win os 作服務器系統,還選擇了 Developer Machine(開發機器),兄弟抱一個,不要哭,重裝。發生這些上述不幸的緣由已經不重要,須要作的是必須切換成 Dedicated MySQL Server Machine(專用MySQL服務器)。sql
重裝切換以後,你會發現,以前安裝的必定是假的 MySQL。數據庫
從開發維護的角度看,若是不肯定列是否爲 NULL,那麼在 SQL 中,就必須加上 「AND tab_NAME != NULL AND tab_NAME != ''」,很容易被忽略,代碼越多,出錯的機率就越大。緩存
索引我作了三點優化:bash
簡單舉例:現有字段「a」、「b」、「c」、「d」組成的聯合索引「abcd」,SQL 條件部分爲:服務器
1 用到索引爲「abcd」,2 用到的索引爲「abd」, (2 同 1)3 用到的索引爲「abc」。條件的順序很重要。跟自拍同樣,臉大的站後面。
抱歉,上述第二點同第一點,一樣用到的索引爲「abcd」。
利用 EXPLAIN 工具分析:app
// 建表語句略,已知建立了組合索引 (abcd)
mysql> EXPLAIN SELECT * FROM test t WHERE t.a = 'q' AND t.b = 'w' AND t.c = 'e' AND t.d = 'f';
+----+-------------+-------+------+---------------+------+---------+-------------------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------------------------+------+--------------------------+
| 1 | SIMPLE | t | ref | name | name | 360 | const,const,const,const | 1 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------------------------+------+--------------------------+
1 row in set
mysql> EXPLAIN SELECT * FROM test t WHERE t.a = 'q' AND t.b = 'w' AND t.d = 'f' AND t.c = 'e';
+----+-------------+-------+------+---------------+------+---------+-------------------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------------------------+------+--------------------------+
| 1 | SIMPLE | t | ref | name | name | 360 | const,const,const,const | 1 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------------------------+------+--------------------------+
1 row in set複製代碼
更多內容請移步個人其餘博文:MySQL 高性能索引以前綴索引框架
多個 LEFT JOIN 確定不行,即便有索引,也很容易形成全表掃描,爲了減小該狀況發生的機率,我通常會採起兩種方法:分佈式
衡量一個 DBA 的水平有多高,得看他反範式能力有多強。
—— 知乎
好比我要根據 A表 的日期,關聯 B表,統計出每一個日期下某個屬性的數量。我能夠在A表中添加一列,用來存儲「數量」,雖然違反了範式,可是性能上獲得了提高。我以爲這是一筆劃算的買賣。
規範化是爲了技術服務,而技術是爲業務服務。規範化也就是套路,能保證不出錯,可是並不能解決特殊問題,特殊問題還須要特殊處理。
以上是僅針對數據庫作的優化,至於緩存(一級緩存、二級緩存),那屬於持久層框架的職責,不在此文記錄範圍以內。