Xpoint
   [напомнить пароль]

Как добиться использования индексов? (конкретный пример)

2005-04-04 00:35:19 [обр] Rom McRitsky [досье]

В продолжение моей предыдущей темы.. От сквозной сортировки решил отказаться и использовать сортировку в пределах одного top.

Структура таблицы:

CREATE TABLE `forum` (
  `id` bigint(20) NOT NULL auto_increment,
  `top` bigint(20) NOT NULL default '0',
  `parent` bigint(20) NOT NULL default '0',
  `sort` bigint(20) NOT NULL default '0',
  `level` int(11) NOT NULL default '0',
.....
  PRIMARY KEY  (`id`),
  KEY `parent` (`parent`),
  KEY `top` (`top`),
  KEY `sort` (`sort`),
  KEY `top_2` (`top`,`sort`)
) TYPE=MyISAM PACK_KEYS=0;

Запрос EXPLAIN SELECT * FROM `forum` ORDER BY top DESC , sort даёт результат:

tabletypepossible_keyskeykey_lenrefrowsExtra
forumALLNULLNULLNULLNULL72Using filesort

Как я понимаю, это не есть гуд.

Запрос же EXPLAIN SELECT top, sort FROM `forum` order by top DESC, sort возвращает

tabletypepossible_keyskeykey_lenrefrowsExtra
forumindexNULLtop_216NULL72Using index; Using filesort

Т.е. здесь уже сортировка используется.

Но дело в том, что мне-то нужен именно запрос № 1 - т.е. все поля таблицы. Как можно добиться использования индексов в данном случае?

спустя 42 минуты [обр] 30-ый [досье]
Сколько записей в таблице? Некоторые сервера отключают индексы, когда вся таблица умещается в одну страницу. Использование индексов в этом случае становится неэффективным. Во втором же случае индекс становится покрывающим и сервер использует только его... не обращаясь к таблице.
спустя 5 минут [обр] 30-ый [досье]

Хм... 72 :-)

Попробуйте добавить еще пару тысяч записей и повторите запрос.

спустя 1 час 45 минут [обр] Rom McRitsky [досье]
Не могу понять, почему индексы используются, если выбирать только эти два поля? А если * - то нет.
спустя 21 минуту [обр] Алексей В. Иванов [досье]
Непосредственно из индексов, видимо, берутся значения. А при выборке всех полей приходится обращаться к строке в таблице.
спустя 7 часов [обр] 30-ый [досье]
Именно так. Это называется "покрывающий индекс". Покрывающий индекс по понятным причинам работает быстрее чем просто индексированный запрос. На маленьких таблицах нет никакого смысла обращаться и к таблице, и к индексу, а значит сервер выбирает что-то одно. При наличии покрывающего индекса ему всегда отдается предпочтение...
спустя 19 дней [обр] Rom McRitsky [досье]
Тему можно закрывать
Powered by POEM™ Engine Copyright © 2002-2005