MySQL не использует индекс - PullRequest
1 голос
/ 02 марта 2012

У меня есть таблица:

CREATE TABLE IF NOT EXISTS `TxtDila` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
...
  `Datum` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
...
  PRIMARY KEY (`ID`),
  KEY `Datum` (`Datum`),
...
  FULLTEXT KEY `Titulek` (`Titulek`,`Anotace`,`Txt`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

Когда я побежал: ОБЪЯСНИТЬ ВЫБЕРИТЕ ID ИЗ ИНДЕКСА ИСПОЛЬЗОВАНИЯ TxtDila (Datum) ЗАКАЗ ПО Datum

Я получаю:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  TxtDila ALL NULL    NULL    NULL    NULL    214603  Using filesort

Даже когда я пытаюсь ОБЪЯСНИТЕ ВЫБЕРИТЕ ID ИЗ TxtDila use index (Datum) USE INDEX (Datum) ORDER BY Datum Я могу видеть сортировку файлов.

Таблица содержит 200 000 записей и около 700 МБ. У меня полнотекстовый индекс.

Кто-нибудь может мне помочь? Спасибо

Ответы [ 3 ]

2 голосов
/ 02 марта 2012

Вы пытаетесь прочитать 200 000 полей идентификаторов записей (вся таблица). Индекс Datum не включает поля идентификаторов, поэтому, как бы вы это ни делали, это будет включать чтение полей идентификаторов с диска. Вы говорите MySQL использовать индекс Datum для упорядочивания записей, а затем читать их. Это в значительной степени означает выполнение до 200 000 операций чтения с диска. MySQL решает (правильно), что меньше труда - просто прочитать все пары (ID, datum) из таблицы за одно большое чтение и упорядочить их в памяти.

Я предлагаю сделать индекс Datum индексом из нескольких столбцов для (Datum, ID).

1 голос
/ 02 марта 2012

Индексы обычно используются, когда в вашем запросе есть предложение WHERE. Альтернативой может быть использование синтаксиса SELECT... FORCE INDEX. Вы можете прочитать об этом здесь: http://dev.mysql.com/doc/refman/5.6/en/index-hints.html

0 голосов
/ 02 марта 2012

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

Кроме того, в этом случае вы получаете сортировку файлов, потому что вы сортируете.

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

...