mysql之优化-分表

一、表的分割

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复制实现多台机器同步,将数据库压力分散

原文地址:https://www.cnblogs.com/daozhangblog/p/12446395.html