優化表的數據類型
在MySQL中,可以使用函數PROCEDURE ANALYSE()對當前應用的表進行分析,該函數可以對數據表中列的數據類型提出優化建議,用戶可以根據應用的實際情況酌情考慮是否實施優化。
使用方法:
mysql> mysql> select * from t PROCEDURE ANALYSE();
+-------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+--------+------------------------+
| Field_name | Min_value | Max_value | Min_length | Max_length | Empties_or_zeros | Nulls | Avg_value_or_avg_length | Std | Optimal_fieldtype |
+-------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+--------+------------------------+
| icydate.t.a | 1 | 2 | 1 | 1 | 0 | 0 | 1.5000 | 0.5000 | ENUM('1','2') NOT NULL |
| icydate.t.b | NULL | NULL | 0 | 0 | 0 | 2 | 0.0 | 0.0 | CHAR(0) |
+-------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+--------+------------------------+
2 rows in set (0.00 sec)
注意:
如果表中的數據較少,提出的建議可能不是我們預期的結果。所有,如果是對一個大表進行分析,提出的建議會更準確。
逆規範化
爲什麼需要?
規範化越高,那麼產生的關係就越多,關係過多的直接結果就是導致表之間的連接操作越頻繁,而表之間的連接操作是性能比較低的操作,直接影響查詢的速度。所以,對於查詢較多的應用,就需要根據實際情況運行逆規範化對數據進行設計,通過逆規範化來提高查詢的性能。
反規範化的好處是降低連接操作的需求、降低外碼和索引的數目,還可能減少表的數目,相應帶來的問題是可能出現數據完整性問題。加快查詢速度,但會降低修改速度。因此,決定做反規範時,一定要權衡利弊。
常用的反規範技術有增加 冗餘列、增加派生列、重新組表和分割表。
-
增加冗餘列:指在多個表中具有相同的列,它常用來在查詢時避免連接操作。
-
增加派生列:指增加的列來自其他表中的數據,由其他表中的數據經過計算生成。增加的派生列其作用是在查詢時減少連接操作,避免使用集函數。
-
重新組表:指如果許多用戶需要查看兩個表連接出來的結果數據,則把這兩個表重新組成一個表來減少連接而提高性能。
-
分割表:垂直拆分和水平拆分
提高查詢速度
查詢如:瞭解最近一週客戶的消費總金額和近一週每天不同時段用戶的消費總金額
有三種實現方式:
-
直接查詢原表,得出想要的結果
-
創建中間表,表結構和原表結構完全相同,轉移要統計的數據到中間表,然後在中間表進行統計
-
創建統計表,凌晨跑任務,將結果彙總到統計表