mysql分表

概述:当一个表的数据很大,比如200G,这时太大,我们只靠索引也不好使了,这时我们需要分表和分区处理。分表有两种形式(水平分表和垂直分表)。

一、水平分表

  核心思想:把一个大表,分割N个小表,小表和大表结构一样,只是把数据分散到不同的表中。

  1.1 简单例子:比如说是通过ID直接登录(例如QQ号),可以直接使用下面的例子

    

    每次登录验证的时候只要把传过来的id除3取模,根据模可以找到对应的表,然后再去对应的表做查询操作,以下为php的相关操作,注册以及登录。

    register.php

复制代码
 1 <?php
 2     //接收参数
 3     //测试的参数有:Pwd,Name, Email
 4     extract($_POST);
 5 
 6     //检查是否为空
 7     if(empty($Pwd) || empty($Name) || empty($Email)){
 8         die('参数不能为空!');
 9     }
10 
11     //连接数据库
12     $link = mysql_connect('127.0.0.1:3306','root', 'root');
13     if(!$link){
14         die('数据库连接失败!');
15     }
16 
17     //选择数据库:这个数据库有:uuid表(产生Id的表)、User0表(存放模为0的用户信息)、User1表(存放模为1的用户信息)和User2表(存放模为2的用户信息)
18     mysql_select_db('test');
19 
20     $sql = 'INSERT INTO uuid VALUES(null)';
21     if(mysql_query($sql, $link)){
22         //获取刚刚插入的Id
23         $id = mysql_insert_id();
24 
25         //根据 Id%3 来确定该新用户存放的表
26         $table_name = 'User'.$Id%3;
27 
28         $pwd = md5($Pwd);
29         $sql = "INSERT INTO $table_name VALUES($id, $Name, $pwd, $Email )";
30 
31         if(mysql_query($sql, $link)){
32             echo '注册成功!';
33         }else{
34             echo '注册失败!';
35         }
36     }
复制代码

    login.php   

复制代码
 1 <?php
 2     header("Content-Type:text/html;charset:utf-8");
 3     
 4     //接收参数:Id, Pwd
 5     extract($_POST);
 6 
 7     //判断是否为空
 8     if(empty($Id) || empty($Pwd)){
 9         die('参数不能为空!');
10     }
11 
12     //连接数据库
13     $link = mysql_connect('127.0.0.1:3306', 'root', 'root');
14     if(!$link){
15         die('连接失败!');
16     }
17 
18     //选择数据库
19     mysql_select_db('test');
20 
21     $table_name = 'User'.$Id%3;
22     $sql = "SELECT * FROM $table_name WHERE Id = $Id";
23     $rst = mysql_query($sql, $link);
24 
25     if($row = mysql_fetch_assoc($rst)){
26         $db_pwd = $row['Pwd'];
27         
28         if($db_pwd == md5($Pwd)){
29             echo '登录成功!';
30         }else{
31             echo '用户名或者密码错误!';
32         }
33     }else{
34         echo 'Id错误!';
35     }
复制代码

 

  1.1 通过邮箱登录,通过邮箱对表进行分割

    

    邮箱基本原理都是和Id差不多,就是要通过一个算法把md5字符串转成十进制的数,然后再取模,以下为把十六进制的md5字符串转成十进制的函数。

function bin_todec($list,$bin){
	static $arr = array(
		'0'=>0,
		'1'=>1,
		'2'=>2,
		'3'=>3,
		'4'=>4,
		'5'=>5,
		'6'=>6,
		'7'=>7,
		'8'=>8,
		'9'=>9,
		'A'=>10,
		'B'=>11,
		'C'=>12,
		'D'=>13,
		'E'=>14,
		'F'=>15
	);
	if(!is_array($list))$list = array($list);
	if($bin == 10) return $list; // 为十进制不转换
	$outarr = array();//定义输出保存数组
	foreach ($list as $num) {
		$atnum = str_split($num); // 将字符串切割为字符数组
		$atlen = count($atnum);
		$total = 0;
		$i = 1;
		foreach ($atnum as $v) {
			$v = strtoupper($v);
			if(array_key_exists($v, $arr)){
				if($arr[$v] ==0) continue;
				$total = $total +$arr[$v]*pow($bin,$atlen-$i);
			}
			$i++;
		}
		$outarr[] = $total;
	}
	return $outarr;
}

$str = 'aa7g9gyut@u4545';
$arr = bin_todec(md5($str),16);
echo prev($arr).'<br/>';
// 这里不能使用$arr[0]%30 因为可能得到一个负数
$no = fmod(prev($arr),30);
echo 'no = '.$no;

### MySQL 分表策略与实现方法 #### 一、分表的概念及其重要性 当单个表的数据量过大时,查询性能可能会显著下降。为了提升数据库的读写效率并优化资源利用,可以采用分表技术。分表的核心在于将一张大表拆分为多个较小的子表,从而减少每次操作涉及的数据规模[^1]。 #### 二、分表的主要方式 分表通常可分为两种主要形式:**垂直分表**和**水平分表**。 - **垂直分表** 垂直分表是指按列划分数据结构,即将同一张表中的某些字段分离出来形成新的表。这种方法适用于部分字段访问频率较低的情况。例如,假设有一张用户表 `users`,其中包含用户的个人信息以及一些不常用的日志记录字段,可以通过创建一个新的表存储这些低频使用的字段来降低原表复杂度[^4]。 - **水平分表** 水平分表则是基于行进行分割,通常是依据某个特定条件(如时间戳、ID范围等),将满足该条件的部分数据存入不同的子表中。这种方式适合于那些随着时间增长不断积累新数据的大表。 ```sql -- 示例:水平分表按照日期分区 CREATE TABLE orders_2023 ( id INT PRIMARY KEY, order_date DATE NOT NULL, amount DECIMAL(10, 2) ); CREATE TABLE orders_2024 LIKE orders_2023; ``` #### 三、分表的具体实现方法 以下是几种常见的分表实现方案: 1. **手动分表** 手动分表是最简单的方式之一,开发者可以根据实际需求自行设计如何分配数据至各个子表。然而,这种做法增加了维护成本,并可能导致逻辑错误的发生概率增加。 2. **使用中间件工具** 随着技术的发展,许多优秀的开源项目提供了自动化的分库分表示能。比如 MyCat 和 ShardingSphere 就是非常流行的两个选项。它们能够帮助企业快速搭建分布式架构环境下的高效解决方案[^3]。 - **MyCat**: 支持灵活配置路由规则,允许自定义 SQL 解析器等功能; - **ShardingSphere**: 提供更丰富的特性集,包括但不限于透明化客户端接入层、动态扩展能力支持等等。 3. **依赖框架完成** 对于应用程序而言,也可以借助 ORM (Object Relational Mapping) 框架内置的支持机制来进行无缝切换。像 Hibernate 或者 Django 的模型迁移功能都可以很好地配合后台服务端一起工作[^2]。 #### 四、注意事项及潜在挑战 尽管分表带来了诸多好处,但也伴随着一定风险或局限之处需要注意规避: - 数据一致性难以保障; - 跨表联结变得困难重重; - 备份恢复过程更加繁琐耗时; 因此,在决定实施之前务必权衡利弊得失后再行动[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值