Индексы ..... секс еще тот ...

Сенсей

Новичок
Индексы ..... секс еще тот ...

ДЛя начала .. есть запрос :

SELECT mod_title, mod_custom_title FROM mods USE INDEX(mod_active, mod_in_block) WHERE mod_active='1' AND mod_in_block='1' ORDER BY mod_custom_title ASC

Дамп таблицы :

PHP:
CREATE TABLE mods (
  mod_id int(11) unsigned NOT NULL auto_increment,
  mod_title varchar(255) NOT NULL default '',
  mod_custom_title varchar(255) NOT NULL default '',
  mod_active tinyint(1) unsigned NOT NULL default '1',
  mod_in_block tinyint(1) unsigned NOT NULL default '1',
  PRIMARY KEY  (mod_id),
  KEY mod_active (mod_active),
  KEY mod_in_block (mod_in_block)
) TYPE=MyISAM;
Делаю EXPLAIN:

type:ALL
possible keys:mod_active, mod_in_block
key:NULL
key len:NULL
ref:NULL
rows:11

Если добавляю в запрос USE INDEX(mod_active, mod_in_block)
результат не меняется ...

Но вот интересная вещь ... если я добавлю к запросу
limit 1

То теперь после explain:
type:range
possible keys:mod_active, mod_in_block
key:mod_active
.....

Но - мне в запросе этот LIMIT нафиг не нужен ..... мне нужно выбрать все записи ...

Читал мануал .. пробовал создать индекс типа aaa(mod_active, mod_in_block, mod_custom_title) - рузультат тот же ....

В чем трабла?
 

Кром

Новичок
Дело в том что твой запрос выбирает те записи, по которым нет индекса. Поэтому mysql все равно обходит всю таблицу. Чтобы улучшить ситуацию можешь проиндексировать те поля, которые используются при выборке. Тогда будет использоваться filesort.
 

Сенсей

Новичок
То есть нужно смотреть не только на поля которые стоят в условиях where ... а еще и на поля которые я выбираю с базы?

В моем случае сделать индексы на поля mod_title, mod_custom_title ?
 

Кром

Новичок
>То есть нужно смотреть не только на поля которые стоят в условиях where ... а еще и на поля которые я выбираю с базы?

У тебя там в условии стоит сортировка по mod_custom_title
Так что это тоже нужно учитывать при индексации.

В любом случае, тебе стоит проверить на своей таблице и выбрать самому подходящий вариант индексации.
 

Сенсей

Новичок
так я ж написал ...

пробовал создать индекс типа aaa(mod_active, mod_in_block, mod_custom_title) - рузультат тот же ....
Мускул на индексы вообще не обращает внимания .. пока я не обьявлю ограничение по LIMIT в запросе ...

Именно это и странно ...
 

Screjet

Новичок
пробовал создать индекс типа aaa(mod_active, mod_in_block, mod_custom_title) - рузультат тот же ....
Это многостолбцовый индекс. Есть смысл почитать ман.
А в твоем случае (запросе) мускул просто решает перебрать все записи. Это он находит более быстрым, чем использовать индексы. Почему? Видимо в индексах число элементов >= половины числа записей в таблице. (Более точный ответ можно найти в мане)
 

ForJest

- свежая кровь
Сенсей
Это не странно. Если под условие запроса попадает более трети записей, MySQL не использует индексы. А LIMIT как раз ограничивает это количество, пусть и после сортировки.
 

TuBu

Guest
Хочешь проверить сделай FORCE INDEX() вместо USE INDEX

и посмотри, сколько строк переберется. Уверен, что больше, чем сейчас, так как mysql довольно грамотно использует (или НЕ использует) индексы
 
Сверху