一、表的分割
1.1 水平分割
案例 大数据量的用户表
三张表:qqlogin0、qqlogin1、qqlogin2 ,将用户id%3,按结果放入不同的表当中
create table qqlogin0(
id int unsigned not null primary key,/* 这个id不能设置自增长 */
name varchar(32) not null default '',
pwd varchar(32) not null default ''
)engine=myisam default charset=utf8;
create table qqlogin1(
id int unsigned not null primary key,/* 这个id不能设置自增长 */
name varchar(32) not null default '',
pwd varchar(32) not null default ''
)engine=myisam default charset=utf8;
create table qqlogin2(
id int unsigned not null primary key,/* 这个id不能设置自增长 */
name varchar(32) not null default '',
pwd varchar(32) not null default ''
)engine=myisam default charset=utf8;
开发 addUser.php ,因为在添加用户时,各个用户id应该确认下,通常我们使用一个辅助表 uuid 表,它可以帮助我们生成一个编号。
uuid表:
create table uuid (
id int unsigned not null auto_increment primary key
)engine=myisam default charset=utf8;
我们在提供检索时,应该根据业务的需求,找到分表的标准,并在检索页面约束用户的检索方式,而且要配合分页。如果有大表检索的需求,也是少数的。
添加用户时:addUser.php
<?php
$conn = mysql_connect('localhost','root','2012o912@');
if (!$conn) {
die('mysql connect error');
}
mysql_select_db('temp',$conn);
$sql = "insert into uuid values (null)";
$res = mysql_query($sql,$conn);
if ($res) {
$uuid = mysql_insert_id();
$tablename = 'qqlogin'.$uuid%4;
$sql = "insert into $tablename values ($uuid,'abc','abc')";
$res = mysql_query($sql,$conn);
if ($res) {
echo 'insert success';
}else {
echo 'insert user error';
}
}else {
die('insert error');
}
?>
查询用户时,checkUser.php
<?php
$conn = mysql_connect('localhost','root','2012o912@');
if (!$conn) {
die('mysql connect error');
}
mysql_select_db('temp',$conn);
$qqid = intval($_GET['id']);
$tablename = 'qqlogin'.$qqid%4;
$sql = "select * from $tablename where id='$qqid'";
$res = mysql_query($sql,$conn);
if ($res) {
$row = mysql_fetch_assoc($res);
print_r($row);
}else {
die('no user');
}
?>
1.2 垂直分割
案例 学生答题系统
考试结果表
id stuno questionid answer(text) grade
1 1 20 [结果。。。] 30
问题表
id question
20 请写一篇散文
需求: 查处1号学生20题得分情况,但answer字段内容非常大,对查询速度有影响
解决:把answer(对查询速度影响较大的字段)单独的提出来,放到另外一张表
回答表 answer
id answer
1 结果。。。
相应的修改考试结果表
id stuno questionid grade
1 1 20 30
总结:把某个表的某些字段,这些字段,在查询时,并不实时关心,但数据量很大, 我们建议大家可以 把这些字段单独的放到另外一张表,从而提高效率。但是不要忘记关联关系。表的字段定义原则是保小不保大,尽量节省空间
二、读写分离
如果数据库压力很大,一台机器支撑不了,可以用MySQL复制实现多台机器同步,将数据库压力分散