У меня возникают трудности с поиском ответа на этот вопрос ...
Для простоты давайте создадим эту ситуацию.
Я создаю такую таблицу ..
CREATE TABLE `test` (
`MerchID` int(10) DEFAULT NULL,
KEY `MerchID` (`MerchID`)
) ENGINE=InnoDB AUTO_INCREMENT=32769 DEFAULT CHARSET=utf8;
Я вставлю некоторые данные в столбец этой таблицы ...
INSERT INTO test
SELECT 1
UNION
SELECT 2
UNION
SELECT null
Теперь я изучаю запрос, используя функцию объяснения MYSQL ...
EXPLAIN
SELECT * FROM test
WHERE merchid IS NOT NULL
Отдых в ID = 1
, SELECT_TYPE = SIMPLE
, Таблица = тест
, Тип = индекс
, Possible_keys = MerchID
, Ключ = MerchID
, Key_len = 5
, Исх = NULL,
, Строки = 3
, Extra = Использование где
; Используя индекс
В моей реальной работе что-то подобное занимает много времени с этим индексом. Если я объявляю таблицу со строкой индекса, читающей «KEY MerchID
(MerchID
) ИСПОЛЬЗУЯ BTREE», я получаю намного лучшие результаты. Функция объяснения, кажется, тоже возвращает те же результаты. Я прочитал некоторые основы о BTREE, Типы хранилища HASH и RTREE для индексов / ключей. Когда тип хранилища не указан, я отказался от предположения о том, что будет принят BTREE. Однако я несколько озадачен, почему при изменении моего индекса для использования этого типа хранилища моя процедура выглядит неэффективной. Любые идеи
Я использую MYSQL 5.1 и кодирую в MYSQL Workbench. Часть процедуры, которая, кажется, помогает, похожа на ту, что я иллюстрировал выше, где столбец объединенной таблицы проверяется на NULL.