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