数据库分片id的设计(PHP实例)

分片是在大型网站数据库设计中经常会用到的解决方法,本文尝试给出一种用PHP实现的设计方案,shard_id的结构是64bit,10bit sharid系统+10bit为类型id+10子类型id+34bit自增id。关于分片设计的更多知识请参考我的其它文章。

<?php
    /**
     * 生产数据库分区id
     *
     * 描述
     *
     * @package        api
     * @author         xxx
     * @copyright      Copyright (c) 2014, xx.im.
     * @since          Version 1.0
     * @filesource
     *
     * @property database2 $database
     */
    class shard
    {
        var $database = null;
        function shard()
        {
            $this->database = load( ‘database‘ );
        }
        function get_shard_id( $table_name, $cate_id, $subcate_id )
        {
            return $this->gen_shard_id( $this->get_next_id( $table_name ), $cate_id, $subcate_id );
        }
        /**
         * 生成shared id
         *
         * ID的结构:
         * 一共64位,10位shard_id,10位类型id,10位子类型id,34位自增id
         * 10 bits shard_id,10 bits cate_id,10 bits subcate_id,34 auto increment id
         * 10+10+10+34
         *
         * @param $next_auto_increment_id required 自增id
         * @param $cate_id                required 类型id
         * @param $subcate_id             optional 子类型id
         *
         * @return bigint
         */
        function gen_shard_id( $next_auto_increment_id, $cate_id, $subcate_id )
        {
            if( empty( $next_auto_increment_id ) )
            {
                return 0;
            }
            $shard_id = $this->get_shard_num( $next_auto_increment_id, TOTAL_SHARD_NUM );
            $shard_id = $shard_id << ( 64 - 10 );            //shard id
            $shard_id |= $cate_id << ( 64 - 10 - 10 );            //大类型
            $shard_id |= $subcate_id << ( 64 - 10 - 10 - 10 );         //子类型
            $shard_id |= $next_auto_increment_id;   //自增id
            return $shard_id;
        }
        /**
         * 解析 shard id 结构
         *
         * ID的结构:
         * 一共64位,10位shard_id,10位类型id,10位子类型id,34位自增id
         * 10 bits shard_id,10 bits cate_id,10 bits subcate_id,34 auto increment id
         * 10+10+10+34
         *
         * @param $shard_id
         *
         * @return array(‘shard_num‘=>0,‘cate_id‘=>0,‘subcate_id‘=>‘‘,‘id‘=>0)
         */
        function parse_shard_id( $shard_id )
        {
            $ret = array( ‘shard_num‘  => 0,
                          ‘cate_id‘    => 0,
                          ‘subcate_id‘ => 0,
                          ‘id‘         => 0 );
            if( empty( $shard_id ) )
            {
                return $ret;
            }
            $ret[ ‘shard_num‘ ] = $shard_id >> ( 64 - 10 );
            $ret[ ‘cate_id‘ ] = ( $shard_id >> ( 64 - 10 - 10 ) ) & 1023;
            $ret[ ‘subcate_id‘ ] = ( $shard_id >> ( 64 - 10 - 10 - 10 ) ) & 1023;
            $ret[ ‘id‘ ] = $shard_id & 17179869183;
            return $ret;
        }
        /**
         * get shard location
         *
         * @param $next_auto_increment_id
         * @param $total_shard_num
         *
         * @return int
         */
        function get_shard_num( $next_auto_increment_id, $total_shard_num )
        {
            return $next_auto_increment_id % $total_shard_num;
        }
        /**
         * 查询表的下一个自增id
         *
         * @param $table_name
         *
         * @return int
         */
        function get_next_id( $table_name )
        {
            if( empty( $table_name ) )
            {
                return 0;
            }
            //
            //  need grant access information_schema privilege
            //
            $sql = "SELECT auto_increment FROM information_schema.tables WHERE table_name = ‘$table_name‘ AND table_schema = DATABASE()";
            /** @var CI_DB_Result $query */
            $data = $this->database->unique( $sql );
            if( !empty( $data ) )
            {
                return isset( $data[ ‘auto_increment‘ ] ) ? $data[ ‘auto_increment‘ ] : 0;
            }
            else
            {
                return 0;
            }
        }
    }
时间: 2024-10-08 19:45:23

数据库分片id的设计(PHP实例)的相关文章

亿级数据库分片分库架构设计亿【转】

数据库扩展性架构设计 http://mp.weixin.qq.com/s/gI6j_TyjJ4jEb-i8HstFaw分库分表需要考虑的问题及方案 http://www.jianshu.com/p/32b3e91aa22c无限容量数据库架构设计 https://mp.weixin.qq.com/s/ad4tpM6cdi9r6vgfbaTzxgMQ消息可达性+幂等性+延时性架构设计 http://mp.weixin.qq.com/s/8oX7u8XcLL80_nNdN-UkvQ高可用+高并发+负载

数据库范式1NF 2NF 3NF BCNF(实例)通俗易懂的讲解

[转] 数据库范式1NF 2NF 3NF BCNF(实例)通俗易懂的讲解     本文对大多数初学数据库原理的同学绝对是个大福利,哈哈,完完整整的看完此篇博文一定能够清晰地理解数据库的四大范式.    不懂者留言相互讨论.     设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合.构造数据库必须遵循一定的规则.在关系数据库中,这种规则就是范式.关系数据库中的关系必须满足一定的要求,即满足不同的范式.目前关系数据库有六种范式:第一范式(1NF).第二范式(2NF)

JAVAEE——宜立方商城13:Mycat数据库分片、主从复制、读写分离、100%Linux中成功安装Mysql的方法

1 海量数据的存储问题 如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求.这个时候NoSQL的出现暂时解决了这一危机.它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升. 但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的.这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库.如果使用关系型数据库

《深入理解mybatis原理1》 MyBatis的架构设计以及实例分析

<深入理解mybatis原理> MyBatis的架构设计以及实例分析 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例,深入代码,来探究MyBatis的实现. 一.MyBatis的框架设计   注:上图很大程度上参考了iteye 上的chenjc_it   所写的博文原理分析之二:框架整体设计 中的MyBatis架构体图,chenjc_it总结的

分库分表和数据库分片方案

分库分表和数据库分片方案 数据库数据量达到千万级别时查询效率会很低,分库分表是一种很有效的解决方案. 垂直划分和水平划分 垂直划分:垂直划分又分为垂直分库和垂直分表两种,垂直分库就是将关联度低的各种表放在不同的数据库中,垂直分表是针对表的列进行的,将字段拆到其他表中形成新表,这样表的记录就会变小,索引就会降低空间消耗,提升性能.垂直划分业务逻辑清晰便于管理,提升高并发性能,但是表无法连接查询,涉及分布式事务技术,且不能从本质上减少表的大数据量,还需要借助水平划分. 水平划分:分为分库分表和库内分

asp.net 微信企业号办公系统-表单及流程设计配置实例

在环境搭建好之后,我们就来学习一下怎样快速创建一个流程,并执行和流转该流程(我们这里讲的只是入门,不涉及到具体流程参数设置). 创建一个流程步骤为:在数据库在创建表-->设计表单-->设置流程-->配置菜单  即可点击新配置的菜单运行该流程. 1.创建业务数据表 根据自己的业务需求我们创建自己的业务表(例如政府部门常用的 文件阅办卡): 建表注意事项: 表必须要有一个主键,主键只能是int型的自增字段或者uniqueidentifier(guid)类型. 2.设计表单 打开表单设计器:

自增长主键Id的设计

一.引言 在使用ORM框架时,一个表有一个主键是必须的,如果没有主键,就没有办法来唯一的更新一条记录.在Sql Server数据库和Mysql数据库设置自增长的主键是一件很轻松的事情,如果在Oracle数据库中设置自增长的主键是比较繁琐的.本文不讨论数据库里单表的自增长问题,探讨的是多表自增长唯一Id的设计.如果各位看官遇到这个多表自增长唯一Id的这个需求,会怎么处理呢? 二.GUID的介绍 关于自增长主键的问题,有些人可能会想到.Net中的GUID,先对这个GUID进行测试. public v

MySQL 高可用:mysql+mycat实现数据库分片(分库分表)

本文引用于http://blog.csdn.net/kk185800961/article/details/51147029 MySQL 高可用:mysql+mycat实现数据库分片(分库分表) 什么是MYCAT: 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务.ACID.可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 一个融合内存缓存技术.NoSQL技术.HDFS大数据的新型SQL Server 结合传统数据库和新型分布式数

SQL Serever学习17——数据库的分析和设计

数据库的分析和设计 设计数据库确定一个合适的数据模型,满足3个要求: 符合用户需求,包含用户所需的所有数据 能被数据库管理系统实现,如sqlserver,oracle,db2 具有比较高质量,容易理解,使用方便,便于维护,效率高 设计步骤分为6步: 需求分析,与用户沟通,达成统一意见 概念结构设计,创建E-R图 逻辑结构设计,从E-R图转为关系模型,1对多,多对多,建立数据模型,数据库三范式 物理结构设计,确定数据类型,是否可空,确定主键,外键,索引 数据库实施 数据库运行维护 数据库的三范式: