前言javascript
在一個項目中,技術的統一性是最重要的,數據庫的設計則是重點中的重點。NoSQL 是目前最流行的數據庫,可是其實用性和功能性遠不如sql數據庫。php
實際不少SQL數據庫被詬病的性能問題大可能是源於程序員的不合理設計,一個好的設計可使sql類數據庫提升幾倍的性能。java
1.細節的優化mysql
字段儘可能設置爲not null 。程序員
規範字段大小,越小越好。redis
表名規範前綴。sql
一個表儘可能儲存一個對象。數據庫
char永遠比varchar更高效。後端
timestamp 比datetime小一倍。緩存
避免字串ID。
單條查詢最後用limit 1。
不用mysql內置函數,由於不會創建查詢緩存。
使用ip而不是域名做爲數據庫的路徑,避免dns解析。
2.使用sql內置功能
例如trigger,procedure,event...等等,能夠有效減小後端代碼的運用,可是不適合處理高觸發的項目。
3.選擇適合的存儲引擎
最多見的就是InnoDB 與 MyISAM. 二者區別請自行百度。
4.將數據保存至內存中
從內存中讀取數據,最大限度減小磁盤的操做,相關內容會在後面詳細解釋。
5.提升磁盤讀寫速度
6.充分使用索引 INDEX
mysql> DROP INDEX index_name ON tab; //添加index mysql> ALTER TABLE tab DROP INDEX index_name ; //刪除index
7.使用內存磁盤
如今基礎設施都過硬,因此能夠將sql 目錄遷移到內存磁盤上。
8.讀寫分離設計
隨着系統變得愈來愈龐大,特別是當它們擁有不好的SQL時,一臺數據庫服務器一般不足以處理負載。可是多個數據庫意味着重複,除非你對數據進行了分離。更通常地,這意味着創建主/從副本系統,其中程序會對主庫編寫全部的Update、Insert和Delete變動語句,而全部Select的數據都讀取自從數據庫(或者多個從數據庫)。
儘管概念上很簡單,可是想要合理、精確地實現並不容易,這可能須要大量的代碼工做。所以,即使在開始時使用同一臺數據庫服務器,也要儘早計劃在php中使用分離的DB鏈接來進行讀寫操做。若是正確地完成該項工做,那麼系統就能夠擴展到2臺、3臺甚至12臺服務器,並具有高可用性和穩定性。
9.使用memcache或者redis
以前的博客有相關的介紹。
10.SQL數據庫分散式佈局
將數據庫分散到多個服務器上,分擔數據庫工做壓力。