【刷題】麪筋-數據庫-mysql的優化

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查詢

  • ①. 避免在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

相關文章
相關標籤/搜索