zoukankan      html  css  js  c++  java
  • 【mysql】分区表

    分区表是什么?

    分区表可以按照事先创建的规则,对mysql的记录进行分组,每一个组具有一个独立的逻辑单元来存储该组的数据。典型的如:按照创建时间的年份分组,按照id的顺序分组(每1000万条数据分一个组)

    如果不分区,mysql也能正常工作,但是如果数据量大某些查询会很慢。

    分区表的优势,也就是为什么myql官方要加入分区表的理由:

    分区表对于按照分区的key来查询时,是有优化过的,可以并行地在不同分区查找数据,然后做集合统一输出。

    典型地是,有冷热数据区分的表(比如按照年份来划分分区),历史数据和最新数据不再使用同一个分区,这样查询最新数据时不再全表查找,仅仅需要在最新的数据对应的分区上查找记录就可以了。比如100万条数据,分了5个区,那么原先需要查找100万,现在只需要查找1个分区,20万的数据。处理速度成倍的加快。

    mysql支持哪些分区方式?

    1,range:id在A到B之间使用0分区;

    2,list:类似于enum,值是散列的固定的几个,比如性别1,2可以放在不同分区;

    3,hash:按照hash的结果做分区标识,比如hash( id DIV 1000),每1000个元素划为一个分区;

    4,key:不再详细介绍,使用时自查

    5,子分区:不再详细介绍,自己查阅下资料

     具体每种的分区方式的创建语法,可以参考:https://www.qcloud.com/community/article/624840

    实践

    1,创建hash分区表;

    2,查看分区表的分区信息(分区名,行数);

    3,和未分区时,使用select是否有区别;

    【创建分区表】
    #说明:创建id除以10的整数值作为一个分区,也就是按序插入每10条数据划分为1个分区,partitions 10表示创建10个分区
    create table sms_partition(id int unsigned not null auto_increment, message varchar(1000) not null default '', primary key(`id`)) engine=InnoDB partition by hash(id DIV 10) partitions 10;
    
    【插入数据】
    insert into sms_partition (message) values("10"),("20"), ("30" ), ( "40"), ("50"), ("60"), ("70"), ("80"), ("90");
    insert into sms_partition (message) values("11"),("21"), ("31" ), ( "41"), ("51"), ("61"), ("71"), ("81"), ("91");
    insert into sms_partition (message) values("12"),("22"), ("32" ), ( "42"), ("52"), ("62"), ("72"), ("82"), ("92");
    
    【查看下分区对应表的信息】
    #可以看到分区表从p0开始创建10个,一直到p9,每个分区对应的记录条数也会列在其中
    mysql> select PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='sms_partition';
    +----------------+------------+
    | PARTITION_NAME | TABLE_ROWS |
    +----------------+------------+
    | p0             |          9 |
    | p1             |         10 |
    | p2             |         10 |
    | p3             |         10 |
    | p4             |         10 |
    | p5             |         10 |
    | p6             |          4 |
    | p7             |          0 |
    | p8             |          0 |
    | p9             |          0 |
    +----------------+------------+
    10 rows in set (0.01 sec)
    
    【查询1】
    mysql> select count(1) from sms_partition where id >= 9 and id <=21;
    +----------+
    | count(1) |
    +----------+
    |       13 |
    +----------+
    【解释查询】
    mysql> explain partitions select count(1) from sms_partition where id >= 9 and id <=21;
    +----+-------------+---------------+------------+-------+---------------+---------+---------+------+------+--------------------------+
    | id | select_type | table         | partitions | type  | possible_keys | key     | key_len | ref  | rows | Extra                    |
    +----+-------------+---------------+------------+-------+---------------+---------+---------+------+------+--------------------------+
    |  1 | SIMPLE      | sms_partition | p0,p1,p2   | range | PRIMARY       | PRIMARY | 4       | NULL |   13 | Using where; Using index |
    +----+-------------+---------------+------------+-------+---------------+---------+---------+------+------+--------------------------+



    11

    特别地,典型使用场景是:

    1,按年切分,使用hash(year)来分区;

    2,按性别切分,可以把用户散列按性别散列在不同分区表中,可以用list;

  • 相关阅读:
    iOS开发UI篇—xib的简单使用
    iOS开发UI篇—字典转模型
    iOS开发UI篇—九宫格坐标计算
    iOS开发UI篇—懒加载
    2020121301-01
    2020120501-01
    2020113001-梦断代码-3
    2020112801-01
    2020112401
    2020112201-1
  • 原文地址:https://www.cnblogs.com/helww/p/8275769.html
Copyright © 2011-2022 走看看