數據庫優化

關於創建表時的


  • 某一字段只有幾個選項(比如民族,性別等),建議採用TINYINT
  • 建議使用UNSIGNED存儲非負數值
  • 存儲時間(精確到秒)建議使用TIMESTAMP類型,因爲TIMESTAMP使用4字節,DATETIME使用8個字節
  • 存儲精確浮點數必須使用DECIMAL替代FLOAT和DOUBLE
  • 避免使用NULL字段(NULL字段很難查詢優化,NULL字段的索引需要額外空間
    NULL字段的複合索引無效)
  • 能用數字類型,就不用字符串類型(首先數據庫處理數字比字符要快,在正常情況下查詢數字就比查詢字符要快
    對數字建立索引也要比字符快)(比如電話號碼)

數據的檢索效率是:char > varchar > text
經常變化的字段用varchar;知道固定長度的用char;能用varchar的地方不用text;

關於外鍵

  • 儘量不適用外鍵,用程序來保證約束

關於索引


  • 選擇唯一性索引
  • 爲經常需要排序、分組和聯合操作的字段建立索引
  • 爲常作爲查詢條件的字段建立索引
  • 限制索引的數目
  • 儘量使用數據量少的索引
  • 刪除不再使用或者很少使用的索引
  • 儘量選擇區分度高的列作爲索引
  • 索引列不能參與計算,保持列“乾淨”(如果計算,導致索引不被使用)

以通配符%和_開頭作查詢時,MySQL不會使用索引
不使用NOT IN和<>操作
一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引
只要列中包含有NULL值都將不會被包含在索引中,複合索引中只要有一列含有NULL值,那麼這一列對於此複合索引就是無效的。所以我們在數據庫設計時不要讓字段的默認值爲NULL

關於查詢

避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引

.應儘量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:select id from t where num is null可以在num上設置默認值0,確保表中num列沒有null值,然後這樣查詢:select id from t where num=0

避免在 where 子句中使用!=或<>操作符,避免在 where 子句中使用or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,(如:select id from t where num=10 or num=20可以這樣查詢:select id from t where num=10 union all select id from t where num=20)

in 和 not in 也要慎用,否則會導致全表掃描 ,連續數值,用between,不用in

模糊查詢,儘量避免以模糊自開頭的查詢,比如name like “%王”,採用全局搜索

很多時候用 exists 代替 in 是一個好的選擇:select num from a where num in(select num from b) 應該爲: select num from a where exists(select 1 from b where num=a.num)

.儘量避免大事務操作,提高系統併發能力

最左前綴匹配原則,非常重要的原則。

limit越大,效率越低
select id from t limit 10000, 10; 改爲 select id from t where id > 10000 limit 10;

使用union all替代union 因爲union有去重開銷

請使用同類型比較

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章