背景
我们都知道,数据量大了,都要对数据库进行分库分表。奈何一直对分表及分表查询没什么概念,这里先不讲那么多概念,先直接演示一个demo。我们直接上车,请坐稳扶好。
分表
创建一个测试的数据库,并创建一个用户表
代码语言:javascript复制create database test;
use test;
create table tb_member(
id bigint primary key auto_increment ,
name varchar(20),
age tinyint not null default '0'
)engine=InnoDB default charset=utf8 AUTO_INCREMENT=1 comment='用户表';
插入100条随机测试数据
代码语言:javascript复制INSERT INTO tb_member (name, age)
SELECT
CONCAT('Member', FLOOR(RAND() * 1000)) AS name,
FLOOR(RAND() * 100) AS age
FROM
information_schema.tables
LIMIT 100;
这里拆分了2张表
代码语言:javascript复制# 表一
DROP table IF EXISTS tb_member1;
create table tb_member1(
id bigint primary key auto_increment ,
name varchar(20),
age tinyint not null default '0'
)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
代码语言:javascript复制# 表二
DROP table IF EXISTS tb_member2;
create table tb_member2(
id bigint primary key auto_increment ,
name varchar(20),
age tinyint not null default '0'
)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
接下来开始进行拆分
代码语言:javascript复制insert into tb_member1(id,name,age) select id,name,age from tb_member where id%2=0;
insert into tb_member2(id,name,age) select id,name,age from tb_member where id%2=1;
分页查询
接下来,我们需要考虑的是一张tb_member表被拆分成2张表,那分页如何实现呢?
代码语言:javascript复制DROP table IF EXISTS tb_member_all;
create table tb_member_all(
id bigint primary key auto_increment ,
name varchar(20),
age tinyint not null default '0'
)ENGINE=MERGE UNION=(tb_member1,tb_member2) INSERT_METHOD=LAST CHARSET=utf8 AUTO_INCREMENT=1 ;
我们会发现,你在member1或者member2中创建数据member_all表中也会出现同样的数据。其实tb_member_all
表里面是没有存储数据,它就是一个外壳,里面的数据是tb_member1
,tb_member2
的并集,数据的存储是放在分表中;做数据查询的时候,就直接用tb_member_all
来做就可以了。
查询数据
代码语言:javascript复制SELECT * FROM tb_member_all order by id LIMIT 10 OFFSET 10;
删除数据
代码语言:javascript复制delete from tb_member_all where id = 11;