не используется индекс при селекте с !=

sage

Новичок
не используется индекс при селекте с !=

есть таблица `table1`

[sql]
CREATE TABLE `table1` (
`idtable1` mediumint(8) unsigned NOT NULL auto_increment,
`idtypes` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`idtable1`),
KEY `idtypes` USING BTREE (`idtypes`)
[/sql]

В таблице 8 записей. Запрос

[sql]EXPLAIN SELECT * FROM `table1` WHERE `idtypes` !=3[/sql]

Код:
id	select_type	table	type	possible_keys	key	key_len		ref	rows	Extra 
1	SIMPLE		table1	ALL	idtypes		NULL	NULL		NULL	8	Using where

[sql]EXPLAIN SELECT * FROM `table1` WHERE `idtypes` =3[/sql]

Код:
id	select_type	table	type	possible_keys	key		key_len		ref	rows	Extra 
1	SIMPLE		table1	ref	idtypes		idtypes		1		const	4
почему индекс не используется при первом запросе? Заранее спасибо.
 

zerkms

TDD infected
Команда форума
[sql]
SELECT COUNT(*) FROM `table1`;
SELECT COUNT(*) FROM `table1` WHERE `idtypes` != 3;
[/sql]

-~{}~ 21.03.08 14:40:

и это, заполни записями побольше, штук до 100 :)
а потом то же самое
 

sage

Новичок
заполнил до 100.

[sql]
SELECT COUNT( * ) /* 100 */
FROM `table1` ;
[/sql]

[sql]
SELECT COUNT( * ) /* 62 */
FROM `table1`
WHERE `idtypes` != 3;
[/sql]

[sql]
EXPLAIN SELECT *
FROM `table1`
WHERE `idtypes` != 3
[/sql]

Код:
id	select_type	table	type	possible_keys	key	key_len		ref	rows	Extra 
1	SIMPLE		table1	ALL	idtypes		NULL	NULL		NULL	100	Using where
[sql]
EXPLAIN SELECT *
FROM `table1`
WHERE `idtypes` = 3
[/sql]

Код:
id	select_type	table	type	possible_keys	key		key_len		ref	rows	Extra 
1	SIMPLE		table1	ref	idtypes		idtypes		1		const	38
 

Gas

может по одной?
zerkms
а разве btree индексы поддерживают операцию != ?
A B-tree index can be used for column comparisons in expressions that use the =, >, >=, <, <=, or BETWEEN operators. The index also can be used for LIKE comparisons if the argument to LIKE is a constant string that does not start with a wildcard character.
http://dev.mysql.com/doc/refman/5.1/en/mysql-indexes.html
дальше ещё говорится о поддержке is null

в доке по постгресу тоже нет упоминания !=
 

Gas

может по одной?
vonica
!= и <> одно и тоже :)

тут важен сам принцип, можно ли над btree структурой выполнить поиск по "не равно" без полного её перебора. Не особо в этом силён, но мне кажется что нет. Может и возможна оптимизация - сравнение искомого значения со значениями в вершине дерева и определение теоритического попадания этого значения в диапазон дерева, если не попадает - значит всё дерево и является результатом. Но я не спец. в этом вопросе и по-этому интересно.
 

zerkms

TDD infected
Команда форума
Gas
хе, даже никогда не задумывался об этом.
мерси за поправку :)
 

Alexandre

PHPПенсионер
тут важен сам принцип, можно ли над btree структурой выполнить поиск по "не равно" без полного её перебора.
Gas +1
над btree структурой выполнить поиск по "не равно" НЕЛЬЗЯ без полного перебора, по этому индексы и не используются. Об этом уже ни раз упоминалось.
 
Сверху