Запрос данных из конкретных секций
На этом шаге мы рассмотрим, как эффективно запрашивать данные из секционированной таблицы, нацеливаясь на конкретные секции. Это одно из основных преимуществ секционирования, поскольку оно позволяет MySQL сканировать только релевантные секции, значительно уменьшая объем обрабатываемых данных и повышая производительность запросов.
Напоминание: Вы все еще должны находиться в оболочке MySQL и использовать базу данных sales_data. Если это не так, используйте:
USE sales_data;
Чтобы запрашивать данные из конкретной секции, вы можете включить условие WHERE, которое фильтрует по ключу секционирования. Оптимизатор запросов MySQL часто достаточно умен, чтобы определить, какие секции релевантны, на основе условия WHERE.
Например, чтобы получить все продажи за 2021 год, вы можете использовать следующий запрос. Обратите внимание, что мы используем прямое условие диапазона для sale_date. Использование функций, таких как YEAR(sale_date), в предложении WHERE может помешать MySQL использовать отсечение секций (partition pruning), что приведет к сканированию всех секций.
SELECT * FROM sales WHERE sale_date >= '2021-01-01' AND sale_date < '2022-01-01';
Чтобы увидеть, какие секции MySQL получает для этого запроса, вы можете использовать оператор EXPLAIN PARTITIONS:
EXPLAIN PARTITIONS SELECT * FROM sales WHERE sale_date >= '2021-01-01' AND sale_date < '2022-01-01';
В выводе EXPLAIN PARTITIONS обратите внимание на столбец partitions. Он должен показывать p2021, что указывает на то, что MySQL сканирует только секцию p2021 для выполнения этого запроса.
+----+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | sales | p2021 | ALL | PRIMARY | NULL | NULL | NULL | 2 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+
Вы также можете запрашивать данные, охватывающие несколько секций. Например, чтобы получить данные о продажах за 2022 и 2023 годы:
SELECT * FROM sales WHERE sale_date >= '2022-01-01' AND sale_date < '2024-01-01';
Повторное использование EXPLAIN PARTITIONS покажет, что MySQL обращается к секциям p2022 и p2023:
EXPLAIN PARTITIONS SELECT * FROM sales WHERE sale_date >= '2022-01-01' AND sale_date < '2024-01-01';
В столбце partitions будет показано p2022,p2023.
+----+-------------+-------+---------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+---------------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | sales | p2022,p2023 | ALL | PRIMARY | NULL | NULL | NULL | 4 | Using where |
+----+-------------+-------+---------------+------+---------------+------+---------+------+------+-------------+
Это демонстрирует, как секционирование позволяет MySQL отсекать (исключать) нерелевантные секции во время выполнения запроса, что приводит к более быстрым результатам, особенно на очень больших таблицах, где сканирование всей таблицы заняло бы много времени.
Чтобы увидеть количество строк в каждой секции, вы можете запросить таблицу INFORMATION_SCHEMA.PARTITIONS:
SELECT
PARTITION_NAME,
TABLE_ROWS
FROM
INFORMATION_SCHEMA.PARTITIONS
WHERE
TABLE_SCHEMA = 'sales_data' AND TABLE_NAME = 'sales';
Этот запрос предоставляет четкое представление о том, как данные распределены по вашим секциям.
+----------------+------------+
| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+
| p2020 | 1 |
| p2021 | 2 |
| p2022 | 2 |
| p2023 | 2 |
| pFuture | 1 |
+----------------+------------+
Вы успешно запросили данные из конкретных секций и наблюдали, как MySQL использует секционирование для оптимизации запросов.