MySQL - поле LONGTEXT вызывает зависание в инструкции SELECT-WHERE

У меня проблема из-за LONGTEXT поле. Все работает нормально, но когда выполняется запрос SELECT с любым предложением WHERE, mysql переходит в спящий режим и никогда не возвращается. Есть только 80 тыс. Записей, и явное сравнение ГДЕ работает нормально. (Некоторые записи имеют размер более 1 МБ, немногие имеют размер около 700 КБ, а остальные - всего лишь от 60 до 100 КБ).

Например:

[HANGs]
SELECT * FROM item_info 
WHERE added_on > '2013-02-14 19:40:05' AND added_on < '2013-02-15 19:40:05'    
;which is like 2 rows only

[FINE]
SELECT * from item_info
WHERE item_id in (1, 10, 1000)

Это обычное поведение?

Вот схема:

CREATE TABLE `item_info` (
  `item_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title_md5` varchar(35) NOT NULL,
  `original_document` longtext NOT NULL,
  `added_on` datetime NOT NULL,
  PRIMARY KEY (`item_id`),
  UNIQUE KEY `md5_Unique` (`title_md5`)
) ENGINE=MyISAM AUTO_INCREMENT=87781 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC;

Есть ли решение? Или я должен разделить поле длинного текста в новую таблицу с внешним ключом?

2 ответа

Вы используете MyISAM столы. На них есть ограничение, которого нет на InnoDB;

MyISAM всегда читает всю строку с диска, даже если некоторые поля не запрашиваются в SELECT.

Схема, кажется, у вас есть индекс на item_id но не на added_on,

Поскольку у вас нет индекса на added_on, запрос сгенерирует полное сканирование таблицы. Полное сканирование таблицы на MyISAM Таблица с длинными строками должна будет прочитать много данных с диска.

Добавление индекса на added_on значительно ускорит ваш запрос, так как вам нужно будет только прочитать строки таблицы, которые действительно нужны.

Звучит просто, но если возможно, обновите свою версию MySQL, попробуйте увеличить лимит памяти и максимальное время выполнения.

Другие вопросы по тегам