MySQL: разделить длинный текстовый столбец на несколько текстовых столбцов

У меня есть небольшая проблема с данными, которые мне нужно решить. У меня есть таблица, в которой обычный текст электронных писем хранится в столбце с длинным текстом. Так было до того, как я начал разрабатывать во фреймворке. В них уже хранится более миллиона строк с большими электронными письмами.

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

Я попробовал следующую простую инструкцию SQL, но поиск записей занимает слишком много времени:
select id from emails where description like "%hello world%";

Согласно документации MySQL, полнотекстовое индексирование можно использовать только в полях char, varchar и text.

Может ли кто-нибудь предложить эффективный способ поиска в столбце с длинным текстом?

or

Существуют ли какие-либо методы/команды SQL, которые можно использовать для просмотра таблицы и разделения содержимого длинного текстового поля на несколько текстовых столбцов для полнотекстового индексирования?


person Kobus Beets    schedule 28.07.2016    source источник


Ответы (1)


Я попробовал следующий простой оператор SQL, но поиск записей занимает слишком много времени: выберите идентификатор из электронных писем, где описание типа «%hello world%»;

К сожалению, mysql не может использовать индексы для запросов %something% даже для полей varchar. На самом деле он также не может использовать индексы для запросов '%something'. Индексы можно использовать только тогда, когда в конце строки стоит подстановочный знак.

Согласно документации MySQL, полнотекстовое индексирование можно использовать только в полях char, varchar и text.

Я бы хотел, чтобы документация была здесь более ясной, речь идет о семействе полей TEXT. Это означает, что вы действительно можете создать индекс для полей типа LONGTEXT и MDIUMTEXT. Попробуй это:

CREATE TABLE ltxt(bada LONGTEXT);
ALTER TABLE ltxt ADD FULLTEXT INDEX ftxt2(bada);

Да, вы будете приятно удивлены!

person e4c5    schedule 28.07.2016
comment
Я уже пытался добавить полнотекстовое индексирование в таблицу, но это не удалось. Вот результат другой попытки для вновь созданной таблицы. create table sample(description longtext); - Query OK, 0 rows affected (0.20 sec). alter table sample add fulltext index descidx(description); - ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes. Используемый движок: InnoDB. - person Kobus Beets; 29.07.2016
comment
Я думаю, что нашел свою проблему. В настоящее время я использую mysql 5.5, а не 5.6. Полнотекстовое индексирование добавляется в InnoDB только начиная с версии mysql 5.6. - person Kobus Beets; 29.07.2016
comment
Да, это правильно, к счастью, обновление - безболезненный процесс. - person e4c5; 29.07.2016
comment
Я использую ОС Debian. Кто-то упомянул, что MySQL 5.6 для него пока недоступен. Это правда или есть какие-то шаги, чтобы обновить его с 5.5 до 5.6? Как только я успешно обновлю MySQL и протестирую поиск в системе, я опубликую шаги, которые я предпринял, в качестве ответа на мой вопрос. Я не системный администратор и имею ограниченные знания по обновлению таких программ, как MySQL. - person Kobus Beets; 29.07.2016
comment
всего наилучшего с вашей установкой 5.7. - person e4c5; 29.07.2016