MySQL優化mysql
1. 避免使用 select *
- 你須要什麼信息,就查詢什麼信息,查詢的多了,查詢的速度確定就會慢
2. 當你只須要查詢出一條數據的時候,要使用 limit 1
- 好比你要查詢數據中是否有男生,只要查詢一條含有男生的記錄就好了,後面不須要再查了,使用Limit 1 能夠在找到一條數據後中止搜索
3. 創建高性能的索引
- 索引不是隨便加的也不是索引越多越好,更不是全部索引對查詢都有效
4. 建數據庫表時,給字段設置固定合適的大小.
- 字段不能設置的太大,設置太大就形成浪費,會使查詢速度變慢
5. 要儘可能使用not null
6. EXPLAIN 你的 SELECT 查詢
- 使用EXPLAIN,能夠幫助你更瞭解MySQL是如何處理你的sql語句的, 你能夠查看到sql的執行計劃,這樣你就能更好的去了解你的sql語句的不足,而後優化語句.
7. 在Join表的時候,被用來Join的字段,應該是相同的類型的,且字段應該是被建過索引的,這樣,MySQL內部會啓動爲你優化Join的SQL語句的機制。
8. 若是你有一個字段,好比「性別」,「國家」,「民族」, 「省份」,「狀態」或「部門」,這些字段的取值是有限並且固定的,那麼,應該使用 ENUM 而不是 VARCHAR。
- 由於在MySQL中,ENUM類型被看成數值型數據來處理,而數值型數據被處理起來的速度要比文本類型快得多。這樣,咱們又能夠提升數據庫的性能。
9. 垂直分割
- 將經常使用和有關係的字段放在相同的表中,把一張表的數據分紅幾張表sql
- 這樣能夠下降表的複雜度和字段的數目,從而達到優化的目的
10. 優化where查詢
好比: select 列 from 表 where age*2=36; 建議改爲 select 列 from 表 where age=36/2;數據庫
-
②. 應儘可能避免在 where 子句中使用 !=或<> 操做符,不然將引擎放棄使用索引而進行全表掃描。性能
-
③. 應儘可能避免在 where 子句中對字段進行 null 值 判斷優化
-
④. 應儘可能避免在 where 子句中使用 or 來鏈接條件.net
11. 不建議使用%前綴模糊查詢,這種查詢會致使索引失效而進行全表掃描
- 例如LIKE 「%name」或者LIKE 「%name%這兩種都是不建議的.可是可使用LIKE 「name%」。
- 對於LIKE 「%name%,可使用全文索引的形式
12. 要慎用in和 not in
- 例如:select id from t where num in(1,2,3) 建議改爲 select id from t where num between 1 and 3
- 對於連續的數值,能用 between 就不要用 in 了
13. 理解in和exists, not in和not exists的區別
-
不少時候用 exists 代替 in 是一個好的選擇:如查詢語句使用了not in那麼內外表都進行全表掃描,沒用到索引,而not exists子查詢依然能用到表上索引,因此不管哪一個表大,用not exists都比not in要快。
- select num from a where num in(select num from b)blog
-
建議改爲: select num from a where exists(select 1 from b where num=a.num)索引
-
區分in和exists主要是形成了驅動順序的改變(這是性能變化的關鍵),若是是exists,那麼之外層表爲驅動表,先被訪問,若是是IN,那麼先執行子查詢。因此IN適合於外表大而內表小的狀況;EXISTS適合於外表小而內表大的狀況。get
-
關於not in和not exists,推薦使用not exists,不只僅是效率問題,not in可能存在邏輯問題it
14. 理解select Count (*)和Select Count(1)以及Select Count(column)區別
-
通常狀況下,Select Count (*)和Select Count(1)兩着返回結果是同樣的
-
假如表沒有主鍵(Primary key), 那麼count(1)比count(*)快,
-
若是有主鍵的話,那主鍵做爲count的條件時候count(主鍵)最快
-
若是你的表只有一個字段的話那count(*)就是最快的
-
count(*) 跟 count(1) 的結果同樣,都包括對NULL的統計,而count(column) 是不包括NULL的統計
參考連接
END