MariaDB 不会根据分区表上的分区进行选择

问题描述 投票:0回答:1

我有这个范例(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)
php laravel mariadb partitioning
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.