MySQL 4.1.10 :: Использование индексов при условии OR :: Не использует возможные

Screjet

Новичок
MySQL 4.1.10 :: Использование индексов при условии OR :: Не использует возможные

Гипотетическая таблица:
[sql]
CREATE TABLE `A`(
`id` int(10) unsigned NOT NULL auto_increment,
`A` int(10) unsigned NOT NULL default '0',
`B` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `A` (`A`),
KEY `B` (`B`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Main structure tree' AUTO_INCREMENT=27 ;
[/sql]
Запрос:
[sql]
EXPLAIN SELECT *
FROM `A`
WHERE `A` =4 OR `B` =4
[/sql]
Возвращает
Код:
id  	select_type	table		type  	possible_keys	key  	key_len  	ref  	rows  	Extra
1 	SIMPLE		A 		ALL 	A,B		NULL 	NULL 		NULL 	25 	Using where
Без условия OR (SQL: .. WHERE `A`=4) использует индекс, а с условием прогоняет всю таблицу.

Как оптимально сделать?
В голову лезет только одна мысль: делать два запроса к таблице.
 

ForJest

- свежая кровь
используй два запроса.
К тому у тебя нет подходящего индекса - в котором учавствуют колоки А и B. Ну и с OR сомнительно что они будут действовать.
 

Screjet

Новичок
Ну и с OR сомнительно что они будут действовать.
не будут. Составные индексы работают либо первый ключ, либо первый и второй. Но не оба.

Неясно, почему муська не хочет использовать последовательно оба индекса. А может не хватает "специального" индекса, типа UNION :)

Придется изза такой чепухи делать два запроса.
 

.des.

Поставил пиво кому надо ;-)
Придется изза такой чепухи делать два запроса.
запрос с union и это самое верное решение. Только вот почему mysql это не умеет оптимизировать сам. :(
 

Роберт

Аналитик
Через UNION получится дублирование записей если они одновременно будут соответствовать и первому и второму запросу... :(
 

Роберт

Аналитик
Тогда пускай использует в запросе принудительное использование ключей - ведь в MySQL можно указать USE INDEX (key_list)
пускай укажет , что надо использовать оба!
 

Апельсин

Оранжевое создание
Роберт, а вы бы может сначала проверяли свои советы на практике?

Для справки, до версии 5.0 MySQL может использовать только один индекс на каждую логическую таблицу.
 

.des.

Поставил пиво кому надо ;-)
Через UNION получится дублирование записей если они одновременно будут соответствовать и первому и второму запросу...
Читаем насчет UNION ALL
Тогда пускай использует в запросе принудительное использование ключей - ведь в MySQL можно указать USE INDEX (key_list)
пускай укажет , что надо использовать оба!
Единственный вариант это составной индекс на A,B + все выбираемые поля, тогда mysql будет просматривать только индекс, но выигрыша в скорости не будет все равно. Точнее будет только проигрыш (причем ощутимый) по сравнению с UNION
 
Сверху