编程 一个简单的示例演示了如何在MySQL中进行分库分表及分页查询

2024-11-18 22:28:35 +0800 CST views 906

一个简单的示例演示了如何在MySQL中进行分库分表及分页查询

背景

数据量大时,分库分表是一种常见的优化方案。为了更好地理解分表及其查询操作,这里我们直接通过一个简单的 demo 演示如何在 MySQL 中进行分表以及分页查询。

一、创建测试数据库和表

首先,创建一个数据库 test 并创建用户表 tb_member,用于存储用户数据。

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 条随机测试数据

使用以下 SQL 语句批量插入 100 条随机数据。

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;

二、分表操作

接下来,将用户表 tb_member 拆分为两张表 tb_member1tb_member2,并将数据根据 id 奇偶分配到这两张表中。

创建两张新表

-- 表一
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;

-- 表二
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;

数据拆分

将数据拆分到两个表中,id 为偶数的数据存入 tb_member1id 为奇数的数据存入 tb_member2

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;

三、分页查询

为了实现跨表的分页查询,我们使用 MERGE 存储引擎,将两张表的查询结果合并到一个虚拟表 tb_member_all 中,便于统一查询。

创建合并表 tb_member_all

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;

说明tb_member_all 表实际上并不存储任何数据,而是通过 tb_member1tb_member2 中的数据进行查询。在操作时可以将其看作一个逻辑上的表。

分页查询示例

tb_member_all 表中进行分页查询,查询第 2 页(从第 11 条开始)的 10 条数据。

SELECT * FROM tb_member_all ORDER BY id LIMIT 10 OFFSET 10;

删除数据示例

tb_member_all 中删除 id = 11 的数据,操作会影响原始分表的数据。

DELETE FROM tb_member_all WHERE id = 11;

四、总结

通过上述演示,我们完成了以下几个操作:

  1. 创建测试数据库并插入数据。
  2. 将数据表拆分为两张表并将数据划分至不同表。
  3. 使用 MERGE 引擎合并多张表,方便进行分页查询和操作。

这个例子演示了最简单的分表和查询方法,非常适合初学者进行实践。

复制全文 生成海报 数据库 MySQL 数据管理 编程 技术教程

推荐文章

Vue3 实现页面上下滑动方案
2025-06-28 17:07:57 +0800 CST
Vue3结合Driver.js实现新手指引功能
2024-11-19 08:46:50 +0800 CST
Elasticsearch 条件查询
2024-11-19 06:50:24 +0800 CST
WebSQL数据库:HTML5的非标准伴侣
2024-11-18 22:44:20 +0800 CST
html文本加载动画
2024-11-19 06:24:21 +0800 CST
Python上下文管理器:with语句
2024-11-19 06:25:31 +0800 CST
2024年微信小程序开发价格概览
2024-11-19 06:40:52 +0800 CST
Vue3中如何处理跨域请求?
2024-11-19 08:43:14 +0800 CST
如何在Vue中处理动态路由?
2024-11-19 06:09:50 +0800 CST
MySQL用命令行复制表的方法
2024-11-17 05:03:46 +0800 CST
企业官网案例-芊诺网络科技官网
2024-11-18 11:30:20 +0800 CST
php使用文件锁解决少量并发问题
2024-11-17 05:07:57 +0800 CST
如何在Rust中使用UUID?
2024-11-19 06:10:59 +0800 CST
Boost.Asio: 一个美轮美奂的C++库
2024-11-18 23:09:42 +0800 CST
120个实用CSS技巧汇总合集
2025-06-23 13:19:55 +0800 CST
16.6k+ 开源精准 IP 地址库
2024-11-17 23:14:40 +0800 CST
JS中 `sleep` 方法的实现
2024-11-19 08:10:32 +0800 CST
FastAPI 入门指南
2024-11-19 08:51:54 +0800 CST
Nginx 跨域处理配置
2024-11-18 16:51:51 +0800 CST
js常用通用函数
2024-11-17 05:57:52 +0800 CST
介绍Vue3的Tree Shaking是什么?
2024-11-18 20:37:41 +0800 CST
Vue3中的JSX有什么不同?
2024-11-18 16:18:49 +0800 CST
介绍 Vue 3 中的新的 `emits` 选项
2024-11-17 04:45:50 +0800 CST
程序员茄子在线接单