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

  • Автор темы Автор темы Screjet
  • Дата начала Дата начала

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) использует индекс, а с условием прогоняет всю таблицу.

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

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

Придется изза такой чепухи делать два запроса.
 
Придется изза такой чепухи делать два запроса.
запрос с union и это самое верное решение. Только вот почему mysql это не умеет оптимизировать сам. :(
 
Через UNION получится дублирование записей если они одновременно будут соответствовать и первому и второму запросу... :(
 
Тогда пускай использует в запросе принудительное использование ключей - ведь в MySQL можно указать USE INDEX (key_list)
пускай укажет , что надо использовать оба!
 
Роберт, а вы бы может сначала проверяли свои советы на практике?

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