数据库-优化-数据库结构的优化-拆分优化
生活随笔
收集整理的這篇文章主要介紹了
数据库-优化-数据库结构的优化-拆分优化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據庫表的垂直拆分
1、垂直拆分定義
所謂的垂直拆分,就是把原來一個有很多列的表拆分成多個表,這解決了表的寬度問題。
2、垂直拆分原則
通常垂直拆分可以按以下原則進行: 1、 把不常用的字段表單獨存放到一個表中。 2、 把大字段獨立存放到一個表中。 3、 把經常一起使用的字段放到一起。 例子:以film表為例在該表中,title和description這兩個字段占空間比較大,況且在使用頻率也比較低,因此可以將其提取出來,將上面的一個達標垂直拆分為兩個表(film和film_ext):如下所示:
1、
2、
數據庫表的水平拆分
1、為什么水平拆分
表的水平拆分是為了解決單表數據量過大的問題,水平拆分的表每一個表的結構都是完全一致的,以下面的peyment表為例來說明
show create table payment; CREATE TABLE `payment` (`payment_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,`customer_id` smallint(5) unsigned NOT NULL,`staff_id` tinyint(3) unsigned NOT NULL,`rental_id` int(11) DEFAULT NULL,`amount` decimal(5,2) NOT NULL,`payment_date` datetime NOT NULL,`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`payment_id`),KEY `idx_fk_staff_id` (`staff_id`),KEY `idx_fk_customer_id` (`customer_id`),KEY `fk_payment_rental` (`rental_id`),KEY `inx_paydate` (`payment_date`),CONSTRAINT `fk_payment_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE,CONSTRAINT `fk_payment_rental` FOREIGN KEY (`rental_id`) REFERENCES `rental` (`rental_id`) ON DELETE SET NULL ON UPDATE CASCADE,CONSTRAINT `fk_payment_staff` FOREIGN KEY (`staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf82、水平不拆分原因
如果單表的數據量達到上億條,那么這時候我們盡管加了完美的索引,查詢效率低,寫入的效率也相應的降低。
3、如何將數據平均分為N份
通常水平拆分的方法為: 1、 對customer_id進行hash運算,如果要拆分為5個表則使用mod(customer_id,5)取出0-4個值。 2、 針對不動的hashid把數據存儲到不同的表中。4、水平拆分面臨的挑戰
1、 夸分區表進行數據查詢 前端業務統計: 業務上給不同的用戶返回不同的業務信息,對分區表沒有大的挑戰。 2、 統計及后臺報表操作 但是對后臺進行報表統計時,數據量比較大,后臺統計時效性比較低,后臺就用匯總表,將前后臺的表拆分開。?
?
總結
以上是生活随笔為你收集整理的数据库-优化-数据库结构的优化-拆分优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库-优化-数据库结构的优化-表范式化
- 下一篇: 数据库-优化-MYSQL的执行顺序