• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 按键分区

    按键分区类似于按哈希分区,除了在哈希分区采用用户定义的表达式的情况下,用于键分区的哈希函数由MySQL服务器提供。NDB群集MD5()用于此目的;对于使用其他存储引擎的表,服务器使用其自己的内部哈希函数。

    语法规则CREATE TABLE ... PARTITION BY KEY类似于用于创建按哈希分区的表的语法规则。主要区别如下:

    • KEY用于而不是HASH
    • KEY仅接受零个或多个列名的列表。如果表有一个主键,则用作分区键的任何列都必须包含表的主键的一部分或全部。如果没有将列名指定为分区键,则使用表的主键(如果有)。例如,以下CREATE TABLE语句在MySQL 8.0中有效:

      CREATE TABLE k1 (
          id INT NOT NULL PRIMARY KEY,
          name VARCHAR(20)
      )
      PARTITION BY KEY()
      PARTITIONS 2;
      

      如果没有主键,但是有一个唯一键,则将唯一键用于分区键:

      CREATE TABLE k1 (
          id INT NOT NULL,
          name VARCHAR(20),
          UNIQUE KEY (id)
      )
      PARTITION BY KEY()
      PARTITIONS 2;
      

      但是,如果唯一键列未定义为NOT NULL,则前一条语句将失败。

      在这两种情况下,即使分区键id未显示在表的输出SHOW CREATE TABLE或表的PARTITION_EXPRESSION列中,该键也是该列INFORMATION_SCHEMA.PARTITIONS

      与其他分区类型不同,用于分区依据的列KEY不限于整数或NULL值。例如,以下CREATE TABLE语句有效:

      CREATE TABLE tm1 (
          s1 CHAR(32) PRIMARY KEY
      )
      PARTITION BY KEY(s1)
      PARTITIONS 10;
      

      前面的语句将不会是有效的,将被指定不同的分区类型。(在这种情况下,简单地使用PARTITION BY KEY()也是有效的,并且具有与相同的效果PARTITION BY KEY(s1),因为s1它是表的主键。)

      有关此问题的更多信息,请参见“分区限制”。

      注意

      再次使用表的主键作为分区键,对使用NDB存储引擎的表进行隐式分区KEY。如果NDB群集表没有显式主键,则存储引擎为每个NDB群集表生成的“隐藏”主键NDB将用作分区键。

      如果为NDB表定义显式分区方案,则表必须具有显式主键,并且分区表达式中使用的任何列都必须是该键的一部分。但是,如果表使用“空”分区表达式(即PARTITION BY KEY()没有列引用),则不需要显式主键。

      您可以使用ndb_desc实用程序(带有该-p选项)观察该分区。

      重要

      对于键分区表,您无法执行ALTER TABLE DROP PRIMARY KEY,因为这样做会产生错误ERROR 1466(HY000):在table中找不到分区函数的字段列表中的字段。对于由分区的NDB群集表,这不是问题KEY。在这种情况下,将使用“ hidden ”主键作为表的新分区键来重组表。请参见MySQL NDB Cluster 8.0

    也可以通过线性键对表进行分区。这是一个简单的示例:

    CREATE TABLE tk (
        col1 INT NOT NULL,
        col2 CHAR(5),
        col3 DATE
    )
    PARTITION BY LINEAR KEY (col1)
    PARTITIONS 3;
    

    所述LINEAR关键字对相同的效果KEY分隔因为它在HASH分区,使用权力-的二个一个算法,而不是模运算而导出的分区号。有关此算法及其含义的说明,请参见“线性哈希分区”。

    上篇:HASH分区

    下篇:子分区