表的拆分分為橫向拆分(記錄的拆分)和縱向拆分(字段的拆分)。拆分表的目的:提高查詢速度。
1.橫向拆分
我們從一個案例去解釋,情景是這樣的:某某博客,有50W的博客量,有2w的用戶,發現隨着用戶和博客數的增加,查詢速度日漸下降,現在要對博客表blog與用戶表user進行優化。
表結構如下:
1 create table blog( 2 bid 3 title 4 content 5 pubtime 6 uid 7 ) 50萬 8 create table user( 9 uid 10 username 11 password 12 nick 13 ...... 14 ) 2萬
首先我們要決定根據哪個字段對記錄進行拆分,查詢決定了拆分,在這里我們根據uid字段對兩個表進行拆分是比較合理的。
1 博客表根據uid去拆分: 2 1-5000------blog_1 3 5001-10000-----blog_2 4 10001-15000----blog_3 5 15001-20000----blog_4 6 人員表根據uid 等分: 7 1-5000------user_1 8 5001-10000-----user_2 9 10001-15000----user_3 10 15001-20000----user_4
比如查詢某人的博客:
1 根據uid確認表名: 2 $num=ceil(12345/5000); 3 select uid,bid,title,pubtime from blog_$num where uid=12345;
2.縱向拆分:把活躍字段(常用)、惰性字段(不常用)分開。
案例:比如人員表,活躍字段像用戶名、密碼、昵稱等,惰性字段像手機號、郵箱、性別等不經常使用和修改的字段。
一張完整的用戶表可以拆分為兩張表,如下:
1 create table user( 2 uid int key auto_increment, 3 username char(20), 4 password char(32) not null, 5 nick char(10) 6 ); 7 create table user_ext( 8 uid 9 regtime 10 name 11 email 12 qq 13 phone 14 sex 15 )