Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не хочет работать индекс 
:(
    Опции темы
Finalist
Дата 2.9.2015, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 23.5.2006

Репутация: нет
Всего: 1



Всех приветствую!
Есть такая таблица с приключениями

Код


CREATE TABLE IF NOT EXISTS `adventure` (
  `ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `Title` varchar(255) DEFAULT NULL,
  `Name` varchar(20) DEFAULT NULL,
  `Description` varchar(255) DEFAULT NULL,
  `Scene` varchar(20) DEFAULT NULL,
  `Act` int(11) unsigned NOT NULL,
  `Map` int(11) unsigned NOT NULL,
  `Island` int(11) unsigned NOT NULL,
  `Type` enum('None','Adventure','Party','Daily','Boss') DEFAULT 'None',
  `Ship` int(11) unsigned DEFAULT NULL COMMENT 'foreign',
  PRIMARY KEY (`ID`),
  KEY `Type` (`Type`),
  KEY `Act` (`Act`),
  KEY `Map` (`Map`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=89 ;

Данных в таблице будет не много, примерно 100-200 записей
Транзакции не использую, данные меняться будут раз в год..
Таблица предназначена только для чтения и формирования текущих приключений игрока.
Поэтому использую MyISAM

Код

SELECT MAX(`Island`) FROM `adventure` WHERE `Act`=1 AND `Map`=1

Этот запрос дает последний остров на текущей карте текущего акта игры. Таким образом узнаю, что пора менять карту и потом пора менять акт на следующие.
explain выдает, что индекс не используется
Код

id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
1    SIMPLE    adventure    ALL    Act,Map    NULL    NULL    NULL    88            Using where

Если заставить использовать индекс
Код

SELECT MAX(`Island`) FROM `adventure` FORCE INDEX(`Act`,`Map`) WHERE `Act`=1 AND `Map`=1

Код

id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
1    SIMPLE    adventure    ref    Map    Map    4    const    63                           Using where

почему не используется оба индекса, а только Мап?
При использовании движка InnoDB используется индекс Мап автоматически, указывать форс не нужно...
Если использовать объединенный индекс
Код

KEY `Act` (`Act`,`Map`)

все равно база не использует его добровально, а только принудительно...
Кто сталкивался? как поступить в этой ситуации?
PM MAIL   Вверх
_zorn_
Дата 2.9.2015, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: 2
Всего: 12



Цитата
Данных в таблице будет не много, примерно 100-200 записей

Зачем тебе вообще индексы тогда ?
PM MAIL   Вверх
Akina
Дата 2.9.2015, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Для одного условия (связывания или отбора - неважно) может использоваться только ОДИН индекс. 
Для показанного запроса оба индекса (и `Act`, и `Map`) скорее всего бесполезны. Они вряд ли высокоселективны (что и показывает их игнорирование), а при селективности менее ~20% сканирование таблицы дешевле использования индекса.
В то же время если создать составной индекс по этим полям, например
Код

CREATE KEY act_map ON adventure(Act, Map)

то он будет высокоселективен (с учётом озвученных данных - менее 1%), и практически наверняка будет использоваться в запросах указанного типа. Кстати, при этом наличие отдельного индекса по полю Act практически потеряет смысл.
Для конкретно показанного запроса ещё более выгоден индекс 
Код

CREATE KEY act_map_isl ON adventure(Act, Map, Island)

поскольку он является покрывающим, и для выполнения этого запроса обращения к таблице вообще не требуется.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Finalist
Дата 2.9.2015, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 23.5.2006

Репутация: нет
Всего: 1



Ну в общем вы подтвердили, что мои опасения напрасны, как и в первом ответе, с малым количеством записей, так и во втором с объединенным индексом.

Меня больше интересовало. почему же база не использует индексы автоматически?
PM MAIL   Вверх
Akina
Дата 2.9.2015, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Finalist @  2.9.2015,  14:53 Найти цитируемый пост)
Меня больше интересовало. почему же база не использует индексы автоматически? 

Сервер (не база) использует индекс только тогда, когда это выгодно. В данном случае это НЕ БЫЛО выгодно - посему индекс не использовался.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0813 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.