我有这个范例(Laravel 应用程序):当您在我的应用程序中编辑和实体时,我不会编辑数据库中的记录。相反,我将该实体复制为一个新实体。数据库中的每个可编辑实体在同一数据库的“change_metadata_partitioned”表中都有一行与其连接。 “change_metadata_partitioned”表中的每一行都有一列显示“已过时”。如果 Obsolete 为 1,则该行属于已编辑实体的旧版本。 正如您所期望的,这会创建大量未使用的数据。因为当我从数据库中获取任何数据的有效版本时,我会查找具有“obsolete=0”的行。这就是为什么我在“change_metadata_partitioned”表上创建了一个分区,如下所示:
Create Table: CREATE TABLE `change_metadata_partitioned` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`table_name` varchar(255) NOT NULL,
`changeable_id` bigint(20) unsigned NOT NULL,
`created_by` bigint(20) unsigned DEFAULT NULL,
`deleted` int(11) NOT NULL DEFAULT 0,
`confirmed_at` datetime DEFAULT NULL,
`confirmed_by` bigint(20) unsigned DEFAULT NULL,
`rejected_at` varchar(255) DEFAULT NULL,
`rejected_by` bigint(20) unsigned DEFAULT NULL,
`deleted_by` bigint(20) unsigned DEFAULT NULL,
`obsolete` int(11) NOT NULL DEFAULT 0,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`,`obsolete`)
) ENGINE=InnoDB AUTO_INCREMENT=5483 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
PARTITION BY LIST (`obsolete`)
(PARTITION `dObsolete` VALUES IN (1) ENGINE = InnoDB,
PARTITION `dNotObsolete` VALUES IN (0) ENGINE = InnoDB)
当我用“WHERE obsolete=?”从这个表中选择时,根据这个分区它应该只在一个分区上搜索。但看看“EXPLAIN SELECT * FROM change_metadata_partitioned”打印出什么:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: change_metadata_partitioned
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1765
Extra: Using where
如您所见,这里没有分区。 这可能是什么原因造成的?
MariaDB version: Ver 15.1 Distrib 10.4.28-MariaDB, for Win64 (AMD64)
EXPLAIN
默认情况下不列出分区。
而不是使用
EXPLAIN PARTITIONS
命令:
CREATE TABLE t1 (a TINYINT NOT NULL) PARTITION BY LIST(a)
(PARTITION `part1` VALUES IN (1), PARTITION `part2` VALUES IN (2));
EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a=1\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
partitions: part1
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 2
Extra: Using where