php 分库分表例子,mysql分库分表实战及php代码操作完整实例

当单表达到几千万时,查询一次要很久,如果有联合查询,有可能会死在那

分库分表主要就是解决这个问题,减小数据库的负担,缩短查询时间

分库:

1)按功能分

用户类库、商品类库、订单类库、日志类、统计类库...

1)按地区分

每个城市或省市一个同样的库,加上后缀或前缀如:db_click_bj、db_click_sh...

分表:

1、横向分表 解决表记录太大问题

1)按某个字段分,

如:discuz的附件表分成10个附件分表pre_forum_attachment_0到pre_forum_attachment_9,还有1个附件索引表pre_forum_attachment存储tid和附件id关系

根据主题的tid最后一位来决定附件要保存在哪个分表,

2)按日期分表

一些日志、统计类的可以按年、月、日、周分表

如:点击量统计click_201601、click_201602

3)使用mysql的merge

先把分表创建好,然后创建总表指定engine= MERGE UNION=(table1,table2) INSERT_METHOD = LAST;

2、纵向分表 解决列过多问题

1)经常组合查询的列放在一个表,常用字段的表可考虑Memory引擎

2)不经常使用的字段单独成表

3)把text、blob等大字段拆分放在附表

如:phpcms的文章表分成主表v9_news和从表v9_news_data,主表存标题、关键字、浏览量等,从表存具体内容、模板等

很多主流mvc框架都提供了切换数据库访问方法

thinkphp切换数据库

$this->db(1,"mysql://root:123456@localhost:3306/test")->query("查询sql");//数据库连接信息可放在配置文件

$this->db(1)->query("查询sql");//下次直接使用编号1定位

分表的话 在查询前先根据分表规则把表名查出

这里用两台机子简单以同个业务库分库,同个表分表,演示插入、查询如何定位库和表并最终成功执行

两台机子:

server1:192.168.1.198

server2:192.168.1.199

两台机子都执行下面操作

1、先创建10个数据库,每个数据库10个表

当然也可以改成百库百表,也可手动创建,我为了方便写了个脚本批量创建

create.php

ini_set('memory_limit', '-1');

$con=mysql_connect("192.168.1.198","open","123456");

if($con){

for($i=0;$i<10;$i++){//10个库

$sql="drop database cloude_{$i};";//删库 谨慎

mysql_query($sql);

$sql="create database cloude_{$i} default character set utf8 collate utf8_general_ci;";

$do=mysql_query($sql,$con)or die(mysql_error());

if($do){

mysql_select_db("cloude_{$i}",$con);

mysql_query("set name gtf8");

for($j=0;$j<10;$j++){//10个表

$sql="drop table if exists user_{$j};";

mysql_query($sql);

$sql="create table user_{$j}

(

id char(36) not null primary key,

name char(15) not null default '',

password char(32) not null default '',

sex char(1) not null default '

你可能感兴趣的:(php,分库分表例子)