mysql分表+查询

垂直分表:

  其实没啥好讲,就是 主键+常用列 放在原表中,再讲 主键+一些不常用列 放在另外的表中。

  这样一个数据页就可以存放更多数据。 但是缺点也明显,可能会增加join 或 union之类的操作。

水平分表:

  今天面试被问到水平分表,突然愣住了,分都知道,但分完如何有效查询就不好说了。

  原则:具体情况具体分析。

  常见几种分法:

    1、按时间分

      典型应用:新闻类、qq状态、朋友圈动态等关注实时或最近的,可以用时间划分,比如当月一张表,上个月一张表。

    2、按区间分

      通常每张表都会有个自增id,可以利用自增id分,比如

      user1表 是1~50

      user2表 是51~100      //insert 操作完成后,判断id值,超过50w时,创建新表

    3、hash分表

      实质上没啥意思,对每一条插入的数据进行取模, 对于单挑记录查询还ok,如果查询相邻几行数据时,就悲剧了。 感兴趣的同学可以看下面相关链接第一条。

  分表后查询:

    1、对于时间水平分表:

      假设朋友圈状态表,每天都会产生20w条记录, 建表 table_20150401 存放。然后用cron跑一个脚本,每天晚上凌晨创建新表,比如 table_20150402。在php程序中

     执行插入的函数进行封装,使用下面这两个函数。 

insertData($data){
    $table = "table_".date("Ymd",time()); //生成当天表名
    insert($data,$table);  // 插入新的表中
}

GetData($condition){
    //如果条件里面带了时间查找,比如:$condition[time] , 则分析出对应表名,选择对应一张或多张表
    $table = "table_".date("Ymd",time()); //生成当天表名
    Get($condition,$table);  // 在新的表中查找
}

    2、对于id区间划分

      新闻或朋友圈状态id 1~1000   1001~2000
                一、数据库里面建表 breakup_table   //这个表里专门记录,新分表和原表的 记录数,方便确定查找哪个表
                比如:   news_1  1   //起始key为1
                        news_2  1001  //起始key为1001
                        news_3  2001

        二、上述 news_1 之类的数据,第一次需要同数据库拿,之后可以放到session或memcached里面

insertUser($data){   $table_num = getCurrentNewNum(); //这个值用memcached去包裹,if($count < 2001)return 3;elseif($count < 1001)return 2;else 1;
    $table = "table_".$table_num); //生成指定表名
    insert($data,$table);  // 插入新的表中
}

GetUser($condition){
    $table_num = getCurrentNewNum();
    $table = "table_".$table_num); //生成指定表名
    Get($condition,$table);  // 在新的表中查找
}

    3、hash分表:

        典型user表 //单独拉出来讲,因为比较特别,第一次查找可能比较花时间,因为必须根据用户名确定去找哪个表
                可以这做:
                        $md5_val = md5($user_name);  //用crc32()应该也可以,但未尝试,如果尝试记得%u,使其不为负
                        $first_val = substr($md5_val, 0,1);//然后去取第一个值
                        $decimal = hexdec($first_val); //十六进制转十进制
                        $table_num = $decimal%3 + 1; // 求余3,使得只有三张表,table_1,table_2,table_3
                      主要原理,利用user_name唯一性,导出md5唯一性,然后求余限制分表数量

insertUser($data){

    $table = "table_".$table_num); //生成指定表名
    insert($data,$table);  // 插入新的表中
}

GetUser($condition){  

    $table = "table_".$table_num); //生成指定表名
    Get($condition,$table);  // 在新的表中查找
}

    hash 分表也可用于id区间分表,即用id值 取模。

水平分表,典型缺点,对于group by或order by之类的查询是灾难。      

相关链接:

  http://www.phpddt.com/php/mysql-tables.html  //good

  

时间: 2024-12-24 01:59:46

mysql分表+查询的相关文章

Mysql 分表查询引擎MERGE

http://www.eduyo.com/doc/mysql/storage-engines.html#merge-storage-engine 如果你DROP MERGE表,你仅在移除MERGE规格.底层表没有受影响.

mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表

之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表,我是按月分的,每个月一张表,这时候的问题是 数据库有多张同样的分表如何根据条件查询? 在进行分页的时候如何计算总记录数?如何查询出所有分表? 每个月的新表是如何创建?系统如何自动创建? 不确定哪个分表的情况如何查询某一条详细记录? 分表查询分表查询可以用union或者union all进行查询uni

mysql分表方法-----MRG_MyISAM引擎分表法

一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是很了解. 首先,我们需要想好到底分多少个表,前提当然是满足应用.这里我使用了一个比较简单的分表方法,就是根据自增id的尾数来分,也就是说分0-9一共10个表,其取值也很好做,就是对10进行取模.另外,还可以根据某一字段的md5值取其中几位进行分表,这样的话,可以分的表就很多了. 好了,先来创建表吧,

python3 mysql 多表查询

python3 mysql 多表查询 一.准备表 创建二张表: company.employee company.department #建表 create table department( id int, name varchar(20) ); create table employee( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male'

mysql 分表与分区

一.操作环境 数据达到百w甚于更多的时候,我们的mysql查询将会变得比较慢, 如果再加上连表查询,程序可能会卡死.即使你设置了索引并在查询中使用到了索引,查询还是会慢.这时候你就要考虑怎么样来提高查询速度了. 抛弃其他的不讲,只从mysql本身的优化来讲,我所知道的方法有三种:mysql集群,mysql分表,mysql分区 二.mysql集群 mysql集群成本比较高,不过这不是这里讲的重点,后期开一篇文章,专门来讲这方面的知识. 三.mysql分表 1. 当数据达到百w,千w的时候,我们就想

mysql分表和表分区详解

为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕.分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率. 什么是分表? 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件.这些子表可以分布在

MYSQL 分表原理(转)

简介:引用MySQL官方文档中的一段话:MERGE存储引擎,也被认识为MRG_MyISAM引擎,是一个相同的可以被当作一个来用的MyISAM表的集合."相同"意味着所有表同样的列和索引信息.你不能合并列被以不同顺序列于其中的表,没有恰好同样列的表,或有不同顺序索引的表.而且,任何或者所有的表可以用myisampack来压缩.例子:mysql> show engines;+--------------------+---------+------------------------

mysql分表的三种方法

mysql分表的3种方法 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. 根据个人经验,mysql执行一个sql的过程如下:1,接收到sql;2,把sql放到排队队列中 ;3,执行sql;4,返回执行结果.在这个执行过程中最花时间在什么地方呢?第一,是排队等待的时间,第二,sql的执行时间.其实这二个是一回事,等待的同时,肯定有sql在执行.所以我们要缩短sql的执行

mysql分表研究

分表是分散数据库压力的好方法. 分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库. 当然,首先要知道什么情况下,才需要分表.个人觉得 单表记录条数达到百万到千万级别时就要使用分表了. 1,分表的分类 1>纵向分表 将本来可以在同一个表的内容,人为划分为多个表.(所谓的本来,是指按照关系型数据库的第三范式要求,是应该在同一个表的.) 分表理由:根据数据的活跃度进行分离,(因为不同活跃的数据,处理方式是不同的) 案例: 对于一个博客系统,文章标题,作者,分类