Overview of Partitioning in MySQL are stored as separate tables in different locations. The user-selected rule by which the division of data is accomplished is known as a  partitioning function , which in MySQL can be the modulus, simple matching against a set of ranges or value lists, an internal hashing function, or a linear hashing function. The function is selected according to the partitioning type specified by the user, and takes as its parameter the value of a user-supplied expression. This expression can be a column value, a function acting on one or more column values, or a set of one or more column values, depending on the type of partitioning that is used. In the case of  RANGE ,  LIST , and [ LINEAR ]  HASH  partitioning, the value of the partitioning column is passed to the partitioning function, which returns an integer value representing the number of the partition in which that particular record should be stored. This function must be nonconstant and nonrandom. It may not contain any queries, but may use an SQL expression that is valid in MySQL, as long as that expression returns either  NULL  or an integer  intval  such that ( MAXVALUE  is used to represent the least upper bound for the type of integer in question.  -MAXVALUE represents the greatest lower bound.) For [ LINEAR ]  KEY ,  RANGE COLUMNS , and  LIST COLUMNS  partitioning, the partitioning expression consists of a list of one or more columns. For [ LINEAR ]  KEY  partitioning, the partitioning function is supplied by MySQL. For more information about permitted partitioning column types and partitioning functions, see Section 24.2, “Partitioning Types” , as well as Section 13.1.20, “CREATE TABLE Statement” , which provides partitioning syntax descriptions and additional examples. For information about restrictions on partitioning functions, see Section 24.6.3, “Partitioning Limitations Relating to Functions” . This is known as  horizontal partitioning —that is, different rows of a table may be assigned to different physical partitions. MySQL 8.0 does not support  vertical partitioning , in which different columns of a table are assigned to different physical partitions. There are no plans at this time to introduce vertical partitioning into MySQL. For creating partitioned tables, you must use a storage engine that supports them. In MySQL 8.0, all partitions of the same partitioned table must use the same storage engine. However, there is nothing preventing you from using different storage engines for different partitioned tables on the same MySQL server or even in the same database. In MySQL 8.0, the only storage engines that support partitioning are  InnoDB  and  NDB . Partitioning cannot be used with storage engines that do not support it; these include the  MyISAM ,  MERGE ,  CSV , and FEDERATED  storage engines. Partitioning by  KEY  or  LINEAR KEY  is possible with  NDB , but other types of user-defined partitioning are not supported for tables using this storage engine. In addition, an  NDB  table that employs user-defined partitioning must have an explicit primary key, and any columns referenced in the table’s partitioning expression must be part of the primary key. However, if no columns are listed in the  PARTITION BY KEY or  PARTITION BY LINEAR KEY  clause of the  CREATE TABLE  or  ALTER TABLE  statement used to create or modify a user-partitioned  NDB  table, then the table is not required to have an explicit primary key. For more information, see Section 23.1.7.1, “Noncompliance with SQL Syntax in NDB Cluster” . When creating a partitioned table, the default storage engine is used just as when creating any other table; to override this behavior, it is necessary only to use the  [STORAGE] ENGINE  option just as you would for a table that is not partitioned. The target storage engine must provide native partitioning support, or the statement fails. You should keep in mind that  [STORAGE] ENGINE  (and other table options) need to be listed  before  any partitioning options are used in a  CREATE TABLE  statement. This example shows how to create a table that is partitioned by hash into 6 partitions and which uses the  InnoDB  storage engine (regardless of the value of  default_storage_engine ): 4657 -MAXVALUE <=  intval  <= MAXVALUE