MySQL 8.4 Reference Manual Including MySQL NDB Cluster 8.4
This section discusses the types of partitioning which are available in MySQL 8.4. These include the types listed here:
RANGE partitioning. 
            This type of partitioning assigns rows to partitions based
            on column values falling within a given range. See
            Section 26.2.1, “RANGE Partitioning”. For information about
            an extension to this type, RANGE COLUMNS,
            see Section 26.2.3.1, “RANGE COLUMNS partitioning”.
          
LIST partitioning. 
            Similar to partitioning by RANGE, except
            that the partition is selected based on columns matching one
            of a set of discrete values. See
            Section 26.2.2, “LIST Partitioning”. For information about
            an extension to this type, LIST COLUMNS,
            see Section 26.2.3.2, “LIST COLUMNS partitioning”.
          
HASH partitioning. With this type of partitioning, a partition is selected based on the value returned by a user-defined expression that operates on column values in rows to be inserted into the table. The function may consist of any expression valid in MySQL that yields an integer value. See Section 26.2.4, “HASH Partitioning”.
          An extension to this type, LINEAR HASH, is
          also available, see
          Section 26.2.4.1, “LINEAR HASH Partitioning”.
        
KEY partitioning. 
            This type of partitioning is similar to partitioning by
            HASH, except that only one or more
            columns to be evaluated are supplied, and the MySQL server
            provides its own hashing function. These columns can contain
            other than integer values, since the hashing function
            supplied by MySQL guarantees an integer result regardless of
            the column data type. An extension to this type,
            LINEAR KEY, is also available. See
            Section 26.2.5, “KEY Partitioning”.
          
      A very common use of database partitioning is to segregate data by
      date. Some database systems support explicit date partitioning,
      which MySQL does not implement in 8.4. However, it is
      not difficult in MySQL to create partitioning schemes based on
      DATE,
      TIME, or
      DATETIME columns, or based on
      expressions making use of such columns.
    
      When partitioning by KEY or LINEAR
      KEY, you can use a DATE,
      TIME, or
      DATETIME column as the partitioning
      column without performing any modification of the column value.
      For example, this table creation statement is perfectly valid in
      MySQL:
    
CREATE TABLE members (
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY KEY(joined)
PARTITIONS 6;
      In MySQL 8.4, it is also possible to use a
      DATE or
      DATETIME column as the partitioning
      column using RANGE COLUMNS and LIST
      COLUMNS partitioning.
    
      Other partitioning types require a partitioning expression that
      yields an integer value or NULL. If you wish to
      use date-based partitioning by RANGE,
      LIST, HASH, or
      LINEAR HASH, you can simply employ a function
      that operates on a DATE,
      TIME, or
      DATETIME column and returns such a
      value, as shown here:
    
CREATE TABLE members (
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY RANGE( YEAR(joined) ) (
    PARTITION p0 VALUES LESS THAN (1960),
    PARTITION p1 VALUES LESS THAN (1970),
    PARTITION p2 VALUES LESS THAN (1980),
    PARTITION p3 VALUES LESS THAN (1990),
    PARTITION p4 VALUES LESS THAN MAXVALUE
);
Additional examples of partitioning using dates may be found in the following sections of this chapter:
For more complex examples of date-based partitioning, see the following sections:
      MySQL partitioning is optimized for use with the
      TO_DAYS(),
      YEAR(), and
      TO_SECONDS() functions. However,
      you can use other date and time functions that return an integer
      or NULL, such as
      WEEKDAY(),
      DAYOFYEAR(), or
      MONTH(). See
      Section 14.7, “Date and Time Functions”, for more information
      about such functions.
    
      It is important to remember—regardless of the type of
      partitioning that you use—that partitions are always
      numbered automatically and in sequence when created, starting with
      0. When a new row is inserted into a
      partitioned table, it is these partition numbers that are used in
      identifying the correct partition. For example, if your table uses
      4 partitions, these partitions are numbered 0,
      1, 2, and
      3. For the RANGE and
      LIST partitioning types, it is necessary to
      ensure that there is a partition defined for each partition
      number. For HASH partitioning, the
      user-supplied expression must evaluate to an integer value. For
      KEY partitioning, this issue is taken care of
      automatically by the hashing function which the MySQL server
      employs internally.
    
      Names of partitions generally follow the rules governing other
      MySQL identifiers, such as those for tables and databases.
      However, you should note that partition names are not
      case-sensitive. For example, the following
      CREATE TABLE statement fails as
      shown:
    
mysql>CREATE TABLE t2 (val INT)->PARTITION BY LIST(val)(->PARTITION mypart VALUES IN (1,3,5),->PARTITION MyPart VALUES IN (2,4,6)->);ERROR 1488 (HY000): Duplicate partition name mypart
      Failure occurs because MySQL sees no difference between the
      partition names mypart and
      MyPart.
    
      When you specify the number of partitions for the table, this must
      be expressed as a positive, nonzero integer literal with no
      leading zeros, and may not be an expression such as
      0.8E+01 or 6-2, even if it
      evaluates to an integer value. Decimal fractions are not
      permitted.
    
In the sections that follow, we do not necessarily provide all possible forms for the syntax that can be used for creating each partition type; for this information, see Section 15.1.20, “CREATE TABLE Statement”.