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

Если вы не можете изменить таблицу, как вы планируете добавлять разделы? –

+0

Приносим извинения за неточность. Я не могу изменить структуру таблицы. Но разделение не влияет на любые изменения для запросов. –

+0

Почему минус за вопрос? –

ответ

1

PARTITION, возможно, не поможет.

NULL - отдельное значение в ИНДЕКСЕ. Думайте о NULL как хранящихся в INDEX перед всеми другими значениями. Следовательно, IS NULL и IS NOT NULL можно рассматривать как «диапазон» для целей оптимизации.

Однако ... Если более 20% (10% -30%, в зависимости от фазы луны) таблицы находится в желаемом диапазоне, оптимизатор решит, что быстрее выполнить полную таблицу сканирование вместо того, чтобы отскакивать назад и вперед между INDEX и данными.

Назад к моему вероятно ...

  • Если небольшое количество строк имеет значение NULL, то индекс будет делать только штрафом; РАЗРЕШЕНИЕ не поможет.
  • Если среднее число строк имеет NULL, то PARTITIONING может заметно помочь.
  • Если в большинстве строк есть NULL, полное сканирование таблицы почти так же хорошо, как сканирование всего одного PARTITION.

Примечание: вы не можете разделять более чем на одну колонку. Итак, если вы PARTITION на PROPERTY_3139, остальным свойствам будет не повезло.

+0

Большое спасибо за ваш ответ. Ваш «вероятно» заставил меня подумать, что более разумно переписать код, который генерирует этот запрос. Потому что строки с значениями Null для этого свойства больше. –

+0

Имеет ли ваше предложение WHERE _ only__ тест для одного столбца NULL? Это проблема производительности сейчас? Или стол будет расти много? Какой процент таблицы имеет NULL? Если стоит продолжить, начните новый вопрос с акцентом на ответы на эти вопросы. –

+0

Это 96% строк с NULL значениями (всего 393940 строк). Запрос, созданный CMS, соединяющий эту таблицу с другим. Итак, я думаю, будет очень эффективно переписать php-код. Разделите его на два запроса - сначала выберете ID для нужной таблицы, второй получит подробную информацию. –

 Смежные вопросы

  • Нет связанных вопросов^_^