商品信息表的反範式化設計:mysql
商品信息:{商品名稱,分類名稱,出版社名稱,圖書的價格,圖書描述,做者}sql
分類信息:{分類名稱,分類描述}數據庫
在線銷售表的反範式化設計:數據庫設計
訂單表:{訂單編號,下單用戶名,手機號,下單日期,支付金額,物流單號,訂單金額}函數
訂單商品的關聯表:{訂單編號,訂單商品分類,訂單商品名,商品數量,商品單價}性能
反範式化後的查詢每一個用戶的訂單的總金額的SQL語句:優化
select 下單用戶名,sum(訂單金額) from 訂單表 group by 下單用戶名;spa
反範式化後的查詢下單用戶和訂單詳情的SQL語句:設計
select a.訂單編號,a.用戶名,a.手機號,b.商品名稱,b.商品的單價,b.商品數量 from 訂單表 a join 訂單商品的關聯表 b on a.訂單編號=b.訂單編號; ###範式化的優缺點code
爲表中的字段選擇合適的數據類型(當一個列能夠選擇多種數據類型時,應該優先考慮數字類型,其次是日期類型或者二進制類型,最後是字符類型。對於相同級別的數據類型,應該優先選擇佔用空間小的數據類型)
整數類型:
tinyint(1個字節)、smallint(2個字節)、
mediumint(3個字節)、int(4個字節)、bigint(8個字節)
複製代碼
實數類型:
float(4個字節,不爲精確類型)、double(8個字節,不爲精確類型)、
decimal(每4個字節存9個數字,小數點佔一個字節,爲精確類型)
複製代碼
varchar和char類型:
varchar類型存儲特色:
用於存儲變長字符串,只佔用必要的存儲空間;
列的最大長度小於255時則只佔用一個額外字節用於記錄字符串長度;
列的最大長度大於255則,要佔用兩個額外字節用於記錄字符串長度
如何對varchar列選擇合適的寬度:
使用最小的符合需求的長度;
varchar(5)和varchar(200)存儲MySQL字符串性能不一樣
varchar的適用場景:
字符串列的最大長度比平均長度大不少;
字符串列不多被更新的字符串的列;
使用了多字符集存儲字符串
char類型存儲特色:
char類型是定長的;
字符串存儲在char類型的列中會刪除末尾的空格;
char類型存儲的最大的寬度是255
char類型的適用的場景:
適合存儲所長度近似的值(eg:md5的值、手機號、身份證號)
適合存儲長度短小的字符串
適合存儲存儲常常更新的字符串
複製代碼
日期類型:
datatime類型以YYYY-MM-DD HH:MM:SS[.fraction]格式存儲數據
datatime類型與時區無關,佔用8個字節存儲空間
存儲的時間範圍:1000-01-01 00:00:00到9999-12-31 23:59:59
timestamp類型存儲從1970年1月1日到當前的秒數,以YYYY-MM-DD HH:MM:SS[.fraction]顯示,佔用4個字節存儲空間
timestamp類型顯示依賴於所指定的時區
timestamp類型在行數據修改時能夠自動修改timestamp列的值
timestamp存儲的時間範圍1970-01-01到2038-01-19
date類型和time類型(mysql5.7以後加入):
date類型佔用的字節數比使用字符串、datatime、int存儲要少,使用date類型只須要3個字節;
date類型使用Date類型還能夠利用日期時間函數進行日期之間的計算;
date類型存儲的日期範圍1000-01-01到9999-12-31之間的日期
time類型用於存儲時間數據:HH:MM:SS
存儲日期時間類型的注意事項:
不要使用字符串類型來存儲日期時間數據;
日期時間類型一般比字符串類型所佔用的存儲空間小;
日期時間類型在進行查找過濾時能夠利用日期來進行對比;
日期時間類型有豐富的處理函數,能夠方便的對時間類型的進行日期計算
使用Int存儲日期時間不如使用Timestamp類型
複製代碼
InnoDB如何選擇主鍵: 主鍵應該儘量的小; 主鍵應該是順序增加的(以減小隨機IO),增長數據的插入效率; InnoDB的主鍵和業務主鍵能夠不一樣
創建數據庫結構
維護優化數據庫