------指導老師 星哥mysql
1.PHP(MYSQL)擅長單表操做,不要作過多無謂的鏈接查詢程序員
2.表字段名不要使用大駝峯命名方式,最好採用下劃線,命名要和團隊習慣一致,通俗易懂。外鍵爲全表名+IDsql
3.表級、字段都要有註釋數據庫
4.MyISAM 適合於一些須要大量查詢的應用,但其對於有大量寫操做並非很好。甚至你只是須要update一個字段,整個表都會被鎖起來,而別的進程,就算是讀進程都沒法操做直到讀操做完成。另外,MyISAM 對於 SELECT COUNT(*) 這類的計算是超快無比的。
InnoDB 的趨勢會是一個很是複雜的存儲引擎,對於一些小的應用,它會比 MyISAM 還慢。他是它支持「行鎖」 ,因而在寫操做比較多的時候,會更優秀。而且,他還支持更多的高級應用,好比:事務。服務器
5.字符串長度要根據具體的業務場景進行合適的設置,若是不明白,多去參考大公司的規則。網絡
6.枚舉型字段,最好設置成tintint,便於之後業務變動和拓展 數據結構
7.對於用戶名和暱稱,不要混淆,一個是登錄帳戶名,一個是顯示暱稱,必要的時候能夠設置成兩個字段。函數
8.int默認是11位,不要私自設置成其餘的長度。性能
9.關於價格,最好以int型,展現和進行業務處理是兩回事,不要混淆。優化
10.關於圖片地址,大小要合適,不要憑想象設置,好比京東是102位,淘寶是80位,必定要合適,之前圖片存不進去。
11.若是含有is_del,通常會有刪除時間,和誰刪除的,儘可能是邏輯刪除。避免物理刪除。
12.若是含有驗證,好比郵箱,手機,最好要多一個字段來代表驗證 是否成功。
13.banner圖及相似的東西,要給一個排序的字段,這樣在從新排序的時候,就不用刪除全部記錄,從新上傳了。
14.避免數據冗餘,好比評論暱稱,若是暱稱更改了,之前的暱稱如何顯示?
15.通常來講,訂單數據是不容許輕易改變的,以避免用戶數據更改了之後,訂單狀態隨之改變
16.支付和訂單狀態不必定要放在一塊兒的,好比貨到付款,那麼寫死的狀態就不對了。
17.設置tingint表示的值的時候,要參考具體的業務邏輯和其餘接口的設計,不要私自設置。
18.屬性能夠寫活,可是不要出現不可控的現象,更麻煩
19.對於數據,要習慣給予一個默認數據,這樣在沒有數據的時候讀取默認值。
20.挑一個你的SELECT語句(推薦挑選那個最複雜的,有多表聯接的),把關鍵字EXPLAIN加到前面。能夠進行表分析,根據分析來優化表
21.當只有一行數據的時候,給予limit 1,MySQL數據庫引擎會在找到一條數據後中止搜索,而不是繼續日後查少下一條符合記錄的數據。 避免多餘搜索
22.要習慣爲條件字段加上索引。
23.在Join表的時候使用至關類型的例,並將其索引
若是你的應用程序有不少 JOIN 查詢,你應該確認兩個表中Join的字段是被建過索引的。這樣,MySQL內部會啓動爲你優化Join的SQL語句的機制。
並且,這些被用來Join的字段,應該是相同的類型的。例如:若是你要把 DECIMAL 字段和一個 INT 字段Join在一塊兒,MySQL就沒法使用它們的索引。對於那些STRING類型,還須要有相同的字符集才行。(兩個表的字符集有可能不同)
在state中查找company
$r = mysql_query("SELECT company_name FROM users
LEFT JOIN companies ON (users.state = companies.state)
WHERE users.id = $user_id");
// 兩個 state 字段應該是被建過索引的,並且應該是至關的類型,相同的字符集。
24.避免 SELECT * 從數據庫裏讀出越多的數據,那麼查詢就會變得越慢。而且,若是你的數據庫服務器和WEB服務器是兩臺獨立的服務器的話,這還會增長網絡傳輸的負載
25.. 永遠爲每張表設置一個ID
咱們應該爲數據庫裏的每張表都設置一個ID作爲其主鍵,並且最好的是一個INT型的(推薦使用UNSIGNED),並設置上自動增長的 AUTO_INCREMENT標誌。
就算是你 users 表有一個主鍵叫 「email」的字段,你也別讓它成爲主鍵。使用 VARCHAR 類型來當主鍵會使用得性能降低。另外,在你的程序中,你應該使用表的ID來構造你的數據結構。
並且,在MySQL數據引擎下,還有一些操做須要使用主鍵,在這些狀況下,主鍵的性能和設置變得很是重要,好比,集羣,分區……
26.儘量使用Not Null
27.IP地址存成 UNSIGNED INT
不少程序員都會建立一個 VARCHAR(15) 字段來存放字符串形式的IP而不是整形的IP。若是你用整形來存放,只須要4個字節,而且你能夠有定長的字段。並且,這會爲你帶來查詢上的優點,尤爲是當你須要使用這樣的WHERE條件:IP between ip1 and ip2。
咱們必須要使用UNSIGNED INT,由於 IP地址會使用整個32位的無符號整形。
而你的查詢,你可使用 INET_ATON() 來把一個字符串IP轉成一個整形,並使用 INET_NTOA() 把一個整形轉成一個字符串IP。在PHP中,也有這樣的函數 ip2long() 和 long2ip()。
1 $r = "UPDATE users SET ip = INET_ATON('{$_SERVER['REMOTE_ADDR']}') WHERE user_id = $user_id";
28.固定長度的表會更快
若是表中的全部字段都是「固定長度」的,整個表會被認爲是 「static」 或 「fixed-length」。 例如,表中沒有以下類型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一個這些字段,那麼這個表就不是「固定長度靜態表」了,這樣,MySQL 引擎會用另外一種方法來處理
29.垂直分割 「垂直分割」是一種把數據庫中的表按列變成幾張表的方法,這樣能夠下降表的複雜度和字段的數目,從而達到優化的目的。