Rechercher dans le manuel MySQL
23.2.1 RANGE Partitioning
A table that is partitioned by range is partitioned in such a
way that each partition contains rows for which the partitioning
expression value lies within a given range. Ranges should be
contiguous but not overlapping, and are defined using the
VALUES LESS THAN
operator. For the next few
examples, suppose that you are creating a table such as the
following to hold personnel records for a chain of 20 video
stores, numbered 1 through 20:
- );
The employees
table used here has no
primary or unique keys. While the examples work as shown for
purposes of the present discussion, you should keep in mind
that tables are extremely likely in practice to have primary
keys, unique keys, or both, and that allowable choices for
partitioning columns depend on the columns used for these
keys, if any are present. For a discussion of these issues,
see
Section 23.6.1, “Partitioning Keys, Primary Keys, and Unique Keys”.
This table can be partitioned by range in a number of ways,
depending on your needs. One way would be to use the
store_id
column. For instance, you might
decide to partition the table 4 ways by adding a
PARTITION BY RANGE
clause as shown here:
- )
- );
In this partitioning scheme, all rows corresponding to employees
working at stores 1 through 5 are stored in partition
p0
, to those employed at stores 6 through 10
are stored in partition p1
, and so on. Each
partition is defined in order, from lowest to highest. This is a
requirement of the PARTITION BY RANGE
syntax;
you can think of it as being analogous to a series of
if ... elseif ...
statements in C or Java in
this regard.
It is easy to determine that a new row containing the data
(72, 'Mitchell', 'Wilson', '1998-06-25', NULL,
13)
is inserted into partition p2
,
but what happens when your chain adds a
21st store? Under this scheme, there
is no rule that covers a row whose store_id
is greater than 20, so an error results because the server does
not know where to place it. You can keep this from occurring by
using a “catchall” VALUES LESS
THAN
clause in the CREATE
TABLE
statement that provides for all values greater
than the highest value explicitly named:
- )
- );
(As with the other examples in this chapter, we assume that the
default storage engine is InnoDB
.)
Another way to avoid an error when no matching value is found
is to use the IGNORE
keyword as part of the
INSERT
statement. For an
example, see Section 23.2.2, “LIST Partitioning”. Also see
Section 13.2.6, “INSERT Syntax”, for general information about
IGNORE
.
MAXVALUE
represents an integer value that is
always greater than the largest possible integer value (in
mathematical language, it serves as a
least upper bound). Now,
any rows whose store_id
column value is
greater than or equal to 16 (the highest value defined) are
stored in partition p3
. At some point in the
future—when the number of stores has increased to 25, 30,
or more—you can use an
ALTER
TABLE
statement to add new partitions for stores
21-25, 26-30, and so on (see
Section 23.3, “Partition Management”, for details of how to
do this).
In much the same fashion, you could partition the table based on
employee job codes—that is, based on ranges of
job_code
column values. For
example—assuming that two-digit job codes are used for
regular (in-store) workers, three-digit codes are used for
office and support personnel, and four-digit codes are used for
management positions—you could create the partitioned
table using the following statement:
- )
- );
In this instance, all rows relating to in-store workers would be
stored in partition p0
, those relating to
office and support staff in p1
, and those
relating to managers in partition p2
.
It is also possible to use an expression in VALUES LESS
THAN
clauses. However, MySQL must be able to evaluate
the expression's return value as part of a LESS
THAN
(<
) comparison.
Rather than splitting up the table data according to store
number, you can use an expression based on one of the two
DATE
columns instead. For
example, let us suppose that you wish to partition based on the
year that each employee left the company; that is, the value of
YEAR(separated)
. An example of a
CREATE TABLE
statement that
implements such a partitioning scheme is shown here:
In this scheme, for all employees who left before 1991, the rows
are stored in partition p0
; for those who
left in the years 1991 through 1995, in p1
;
for those who left in the years 1996 through 2000, in
p2
; and for any workers who left after the
year 2000, in p3
.
It is also possible to partition a table by
RANGE
, based on the value of a
TIMESTAMP
column, using the
UNIX_TIMESTAMP()
function, as
shown in this example:
- )
- );
Any other expressions involving
TIMESTAMP
values are not
permitted. (See Bug #42849.)
Range partitioning is particularly useful when one or more of the following conditions is true:
You want or need to delete “old” data. If you are using the partitioning scheme shown previously for the
employees
table, you can simply useALTER TABLE employees DROP PARTITION p0;
to delete all rows relating to employees who stopped working for the firm prior to 1991. (See Section 13.1.9, “ALTER TABLE Syntax”, and Section 23.3, “Partition Management”, for more information.) For a table with a great many rows, this can be much more efficient than running aDELETE
query such asDELETE FROM employees WHERE YEAR(separated) <= 1990;
.You want to use a column containing date or time values, or containing values arising from some other series.
You frequently run queries that depend directly on the column used for partitioning the table. For example, when executing a query such as
EXPLAIN SELECT COUNT(*) FROM employees WHERE separated BETWEEN '2000-01-01' AND '2000-12-31' GROUP BY store_id;
, MySQL can quickly determine that only partitionp2
needs to be scanned because the remaining partitions cannot contain any records satisfying theWHERE
clause. See Section 23.4, “Partition Pruning”, for more information about how this is accomplished.
A variant on this type of partitioning is RANGE
COLUMNS
partitioning. Partitioning by RANGE
COLUMNS
makes it possible to employ multiple columns
for defining partitioning ranges that apply both to placement of
rows in partitions and for determining the inclusion or
exclusion of specific partitions when performing partition
pruning. See Section 23.2.3.1, “RANGE COLUMNS partitioning”, for
more information.
Partitioning schemes based on time intervals. If you wish to implement a partitioning scheme based on ranges or intervals of time in MySQL 8.0, you have two options:
Partition the table by
RANGE
, and for the partitioning expression, employ a function operating on aDATE
,TIME
, orDATETIME
column and returning an integer value, as shown here:- )
- );
In MySQL 8.0, it is also possible to partition a table by
RANGE
based on the value of aTIMESTAMP
column, using theUNIX_TIMESTAMP()
function, as shown in this example:- )
- );
In MySQL 8.0, any other expressions involving
TIMESTAMP
values are not permitted. (See Bug #42849.)NoteIt is also possible in MySQL 8.0 to use
UNIX_TIMESTAMP(timestamp_column)
as a partitioning expression for tables that are partitioned byLIST
. However, it is usually not practical to do so.Partition the table by
RANGE COLUMNS
, using aDATE
orDATETIME
column as the partitioning column. For example, themembers
table could be defined using thejoined
column directly, as shown here:- )
- );
Traduction non disponible
Le manuel MySQL n'est pas encore traduit en français sur l'infobrol. Seule la version anglaise est disponible pour l'instant.
Document créé le 26/06/2006, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/mysql-rf-partitioning-range.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
Références
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.