0

空值我有一个表:分区通过与MySQL

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不是一个范围,我不能将它用作值列表。

+0

如果您无法更改表格,您希望如何添加分区? – 2015-04-01 13:05:36

+0

我对错误表示歉意。我无法改变表格的结构。但分区不会影响查询的任何更改。 – 2015-04-01 13:07:58

+0

为什么减去这个问题? – 2015-04-01 15:17:00

回答

1

PARTITION可能不会帮助。

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

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

回到我可能 ...

  • 如果行有少数NULL,则指数会做得很好; PARTITIONing不会有太大的帮助。
  • 如果中等数量的行具有NULL,则PARTITIONing可以显着提供帮助。
  • 如果大多数行具有NULL,则全表扫描几乎与扫描一个PARTITION中的所有行一样好。

注意:您不能在多个列上使用PARTITION。所以,如果你在PROPERTY_3139上分区,那么其余的属性将失去运气。

+0

非常感谢您的回答。您的“可能”让我觉得重写代码会更合理,这会生成该查询。因为此属性的Null值更多。 – 2015-04-02 13:45:28

+0

您的WHERE子句是否仅对一列为NULL的测试进行测试?现在是性能问题吗?或者桌子会增长很多?表的哪个百分比具有NULL?如果值得进一步研究,请着重回答这些问题开始一个新问题。 – 2015-04-02 15:57:41

+0

它的空值为96%(共393940行)。由CMS生成的查询,将此表与另一个表连接起来。所以,我认为重写php代码会很有效。将它分成两个查询 - 第一个将选择所需表格的ID,第二个将获得详细信息。 – 2015-04-02 19:56:02