對于後端開發人員來說,經常會和資料打交道,是以資料庫的優化很重要,今天總結下部分資料庫的優化知識。主要可以通過以下幾種方式對資料庫進行優化:
性能優化
- 表的設計合理化,符合三大範式(3NF)
- 1NF是對屬性的原子性限制,要求屬性(列)具有原子性,不可再分解;(隻要是關系型資料庫都滿足1NF)
- 2NF是對記錄的惟一性限制,要求記錄有惟一辨別,即實體的惟一性;
- 3NF是對字段備援性的限制,它要求字段沒有備援。 沒有備援的資料庫設計可以做到。
- 添加适當索引(index) [四種: 普通索引、主鍵索引、唯一索引unique、全文索引]
- 較頻繁的作為查詢條件字段應該建立索引;
- 唯一性太差的字段不适合單獨建立索引,即使頻繁作為查詢條件;
- 更新非常頻繁的字段不适合建立索引
- 不會出現在WHERE子句中的字段不該建立索引
- 分表技術(水準分割、垂直分割);
- 讀寫[寫: update/delete/add]分離;
- 存儲過程 [子產品化程式設計,可以提高速度];
- 對mysql配置優化 [配置最大并發數my.ini, 調整緩存大小 ];
- mysql伺服器硬體更新;
- 定時的去清除不需要的資料,定時進行碎片整理(MyISAM)。
SQL語句優化
- 通過show status指令了解各種SQL的執行頻率;
- 定位執行效率較低的SQL語句-(重點select;
- 通過explain分析低效率的SQL;
- 确定問題并采取相應的優化措施。
添加索引
- 索引主要可以分為以下幾種:
- 主鍵索引,主鍵自動的為主索引 (類型Primary);
- 唯一索引 (UNIQUE);
- 普通索引 (INDEX);
- 全文索引 (FULLTEXT) [适用于MyISAM] ——》sphinx + 中文分詞 coreseek [sphinx 的中文版 ];
- 綜合使用=>複合索引
- 可能使用到索引
- 對于建立的多列索引,隻要查詢條件使用了最左邊的列,索引一般就會被使用。
- 對于使用like的查詢,查詢如果是 ‘%aaa’ 不會使用到索引, ‘aaa%’ 會使用到索引。
- 不使用索引
- 如果條件中有or,即使其中有條件帶索引也不會使用。
- 對于多列索引,不是使用的第一部分,則不會使用索引。
- like查詢是以%開頭
- 如果列類型是字元串,那一定要在條件中将資料使用引号引用起來。否則不使用索引。(添加時,字元串必須’’)
- 如果mysql估計使用全表掃描要比使用索引快,則不使用索引。
-
作者:譚慶波
連結:https://www.zhihu.com/question/36431635/answer/381557352
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
資料庫優化分三個等級。
第一級就是常見的簡單DDL DML調優。SQL寫的好不好啊,group by order by對不對啊,select别用*,記得要要hit index啊。資料庫表設計好點啊,主鍵外鍵索引啊,執行計劃看一看啊。市面上九成九的資料庫調優都在這。
第二級是DBA層級調優。MSSQL,ORACLE,MYSQL都各自有幾十項配置。在不同的應用場景下需要針對性調整。比如MSSQL 的MAXDOP在有高并發且大SQL的情況下要适當調整限制,而全部是小SQL的情況下可以設定為無限。比如ORACLE的自動優化器在SQL性狀相似的時候不開也沒太大問題,CPU超過16個core的時候,parallel hint到底設定為幾。這些都是學問。都沒個定數,都是要DBA拿實際生産資料套研究的。oracle的AWR, entierprise manager, MSSQL的一堆管理SP,trace log,都是必讀項。到這層,已經是每個公司每百程式員1,2個人的事情了。
最後一級是資料庫中間件和infra層級調優。上個月我處理過一個MSSQL叢集死慢死慢,但是單node就沒問題。後來查出來是windows 叢集的仲裁設定有問題,導緻太頻繁failover,雖然failover号稱無縫,但是實際上還是有10秒左右資料庫無法通路的。這一級,基本上是千人以上的公司才會遇到的問題,也就幾個人懂,但凡其中有2個人同時休假,就歇了
作者:蘿魏紫
連結:https://www.zhihu.com/question/36431635/answer/489961019
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。