如何将值插入Mysql哈希分区表?

如何将值插入Mysql哈希分区表?,mysql,hash,partitioning,Mysql,Hash,Partitioning,我创建了一个mysql表,并对其进行了如下哈希分区 mysql> CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated D

我创建了一个mysql表,并对其进行了如下哈希分区

      mysql> CREATE TABLE employees (
               id INT NOT NULL,
               fname VARCHAR(30),
               lname VARCHAR(30),
               hired DATE NOT NULL DEFAULT '1970-01-01',
               separated DATE NOT NULL DEFAULT '9999-12-31',
               job_code INT,
               store_id INT,
               PRIMARY KEY(id)
             )
             PARTITION BY HASH(id)
             PARTITIONS 10;
在成功创建表之后,我将值1(插入到store_id)插入到如下所示的表中

  mysql>INSERT INTO employees (store_id) values (1);
现在我不明白1的这个值会变成什么?哪个分区(p0、p1、p2……p10)存储了\u id值1?我以为它会进入p0。但事实并非如此。看下面,我是这样检查的

  mysql>SELECT TABLE_NAME, PARTITION_NAME, TABLE_ROWS, AVG_ROW_LENGTH,DATA_LENGTH FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME LIKE 'employees';
它显示了进入p1的值。请参见下文

   mysql>
        +------------+----------------+------------+----------------+-------------+
        | TABLE_NAME | PARTITION_NAME | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH |
        +------------+----------------+------------+----------------+-------------+
        | employees  | p0             |          0 |              0 |       16384 |
        | employees  | p1             |          1 |          16384 |       16384 |
        | employees  | p2             |          0 |              0 |       16384 |
        | employees  | p3             |          0 |              0 |       16384 |
        | employees  | p4             |          0 |              0 |       16384 |
        | employees  | p5             |          0 |              0 |       16384 |
        | employees  | p6             |          0 |              0 |       16384 |
        | employees  | p7             |          0 |              0 |       16384 |
        | employees  | p8             |          0 |              0 |       16384 |
        | employees  | p9             |          0 |              0 |       16384 |
        +------------+----------------+------------+----------------+-------------+
我不知道为什么它被插入p1。再次测试它。。这次我插入了值2

       mysql> INSERT INTO employees (store_id) values (2);
它已进入p2

         +------------+----------------+------------+----------------+-------------+
         | TABLE_NAME | PARTITION_NAME | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH |
         +------------+----------------+------------+----------------+-------------+
         | employees  | p0             |          0 |              0 |       16384 |
         | employees  | p1             |          1 |          16384 |       16384 |
         | employees  | p2             |          1 |          16384 |       16384 |
         | employees  | p3             |          0 |              0 |       16384 |
         | employees  | p4             |          0 |              0 |       16384 |
         | employees  | p5             |          0 |              0 |       16384 |
         | employees  | p6             |          0 |              0 |       16384 |
         | employees  | p7             |          0 |              0 |       16384 |
         | employees  | p8             |          0 |              0 |       16384 |
         | employees  | p9             |          0 |              0 |       16384 |
         +------------+----------------+------------+----------------+-------------+
为什么要将值插入不同的分区?散列分区是否遵循任何规则?有趣的是,它离开了p0,开始插入p1?解释?

如果对您的MySQL版本的解释成立,分区号可以这样找到:
MOD([您的输入],[分区数])


在您的情况下,第一行可能具有
id
=1,并且计算将是
MOD(1,10)
=1。该行转到分区1(
id
=2转到分区2)。

谢谢您的回答。因此,在散列分区中,我们不能肯定地说插入的值在所有分区中平均分布。仪式在这个链接中,MOD的第一个参数是被除数,第二个参数是除数。如果股息小于除数会发生什么?示例MOD(2,7)?它将如何在所有分区中选择分区来存储值?提前谢谢:-)我在这里找到了答案。谢谢:-)关于均匀分布:你自己控制它。如果
id
仅为1,11,21,31,41等,则仅填充分区1。但对于id列来说,这种情况可能很少发生。
按哈希分区
没有提供我所知的性能优势。你希望得到什么?(乔恩的回答很好地回答了你的问题;我要指出,
HASH
可能无论如何都是无用的。)