mysql數據庫裏的一些坑(讀高性能mysql有感)

1.int類型後邊的括號中的值並不會影響其存儲值的範圍,僅僅指示了整數值的顯示寬度。例如int(8)和int(10)的存儲範圍都是-2147483648~2147483647。當你選擇了填充零時,才能看出區別。mysql

2.主鍵自增id適合設置爲無符號的int類型,這樣最大值能夠增長一倍:4294967295(2的32次方減一)。sql

3.要創建索引的字段最好設爲NOT NULL,固然其餘字段也最好這樣作。函數

4.varchar的長度確定時越短越好,不要使用默認的255,更長的列會消耗跟多的內存。性能

5.char類型存儲的數據長度小於最大長度時會用空格填充,檢索時再剔除,所以若是存入的string最後有空格,查詢出來是沒有的。優化

6.Memory引擎不支持blob和text類型字段,若是列表查詢使用了blob或text的列且使用了臨時表排序,那麼將會使用磁盤臨時表,嚴重影響性能。設計

7.時間戳格式timestamp和datetime,前者佔用空間小(4bytes)且與時區相關,優先使用。除非是範圍超過了timestamp的範圍(1970~2038),不推薦使用int類型。code

8.推薦使用枚舉類型(enum)來替代字符串(如性別男女),但注意其實際存儲的是整數(1,2,...對應字段值順序),排序也是按照整數大小排序,而非映射的字符串。排序

9.常常變更的列不適合使用枚舉類型,由於Alert Table對於數據量大的表來講,性能是不得不考慮的一件事情。索引

10.IPv4地址能夠保存爲無符號int類型,由於它其實是一個32位的無符號整數,使用mysql函數(INET_ATON和INET_NTOA)進行轉換。事務

11.範式與反範式的使用並非絕對性的,須要根據本身的業務和數據量合理折中使用。數據量大查詢頻率高的時候適當的創建冗餘字段減小關聯,而數據少關聯緊密的場合遵循範式化設計。

12.sql中limit 5表示搜索前五條記錄,limit 5,10檢索6-10條記錄,limit 5,-1表示6-last條記錄

13.多表聯查count統計時,儘可能根據查詢條件減小連表的數量,數量越少查詢時間越少,少一個表(假如這個表數據量很大或者屬於別的庫那優化的效果更好)可能減小至少一半的時間。

14.Mysql是不支持嵌套事務的,開啓了一個事務的狀況下,再開啓一個事務,會隱式的提交上一個事務。要使用嵌套事務能夠經過代碼控制開啓次數計數,最後提交時判斷計數。

待續。。。

相關文章
相關標籤/搜索