gpt4 book ai didi

mysql - 使用 MySQL 按空值分区

转载 作者:搜寻专家 更新时间:2023-10-30 23:45:25 25 4
gpt4 key购买 nike

我有一张 table :

CREATE TABLE `NewTable` (
`IBLOCK_ELEMENT_ID` int(11) NOT NULL ,
`PROPERTY_1836` int(11) NULL DEFAULT NULL ,
`DESCRIPTION_1836` varchar(255) CHARACTER SET cp1251 COLLATE cp1251_general_ci NULL DEFAULT NULL ,
`PROPERTY_1837` int(11) NULL DEFAULT 0 ,
`DESCRIPTION_1837` varchar(255) CHARACTER SET cp1251 COLLATE cp1251_general_ci NULL DEFAULT NULL ,
`PROPERTY_1838` decimal(18,4) NULL DEFAULT NULL ,
`DESCRIPTION_1838` varchar(255) CHARACTER SET cp1251 COLLATE cp1251_general_ci NULL DEFAULT NULL ,
`PROPERTY_3139` int(11) NULL DEFAULT 0 ,
`DESCRIPTION_3139` varchar(255) CHARACTER SET cp1251 COLLATE cp1251_general_ci NULL DEFAULT NULL ,
`PROPERTY_3173` decimal(18,4) NULL DEFAULT NULL ,
`DESCRIPTION_3173` varchar(255) CHARACTER SET cp1251 COLLATE cp1251_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`IBLOCK_ELEMENT_ID`),
INDEX `ix_perf_b_iblock_element_pr_1` (`PROPERTY_1837`) USING BTREE ,
INDEX `ix_perf_b_iblock_element_pr_2` (`PROPERTY_1836`) USING BTREE ,
INDEX `ix_perf_b_iblock_element_pr_3` (`PROPERTY_3139`) USING BTREE
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=cp1251 COLLATE=cp1251_general_ci
ROW_FORMAT=COMPACT;

还有一个带有条件的查询:

WHERE PROPERTY_3139 IS NULL

我无法更改表或查询。但我知道,如果我将一个表拆分为 2 个分区 - 仅选择可为空值的查询将运行得更快。

我可以使用什么样的技巧来做到这一点? NULL 和 NOT NULL 不是一个范围,我不能将它用作值列表。

最佳答案

PARTITION可能没有帮助。

NULL 是 INDEX 中的一个单独值。将 NULL 视为在所有其他值之前存储在 INDEX 中。因此,IS NULLIS NOT NULL 可以被视为用于优化目的的“范围”。

但是...如果超过 20%(10%-30%,取决于月相)的表在所需范围内,优化器将决定进行全表扫描会更快而不是在索引和数据之间来回跳动。

回到我的可能...

  • 如果少数行有 NULL,索引就可以了;分区不会有太大帮助。
  • 如果中等数量的行有 NULL,那么 PARTITIONing 可能会有显着的帮助。
  • 如果大多数行都为 NULL,则全表扫描几乎与扫描一个 PARTITION 的所有行一样好。

注意:您不能对多个列进行分区。因此,如果您在 PROPERTY_3139 上进行 PARTITION,则其余属性将不走运。

关于mysql - 使用 MySQL 按空值分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29391404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com