Полнотекстовая ИНДЕКСАЦИЯ на MyISAM очень медленная

у меня есть стол

CREATE TABLE `dataFullText` (
`id` int(11) NOT NULL,
`title` char(255) NOT NULL,
`description` text NOT NULL,
`name` char(100) NOT NULL,
`ref` char(50) NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `fulltext` (`ref`,`name`,`title`,`description`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

Который имеет около 100 тыс. записей.

mysql> select * from information_schema.TABLES WHERE TABLE_NAME='jobsFullText'\G
*************************** 1. row ***************************
TABLE_CATALOG: NULL
TABLE_SCHEMA: ****
TABLE_NAME: dataFullText
TABLE_TYPE: BASE TABLE
ENGINE: MyISAM
VERSION: 10
ROW_FORMAT: Dynamic
TABLE_ROWS: 79495
AVG_ROW_LENGTH: 791
DATA_LENGTH: 62938804
MAX_DATA_LENGTH: 281474976710655
INDEX_LENGTH: 53625856
DATA_FREE: 51328
AUTO_INCREMENT: NULL
CREATE_TIME: 2011-10-03 13:38:25
UPDATE_TIME: 2011-10-03 13:55:56
CHECK_TIME: 2011-10-03 13:38:48
TABLE_COLLATION: utf8_general_ci
CHECKSUM: NULL
CREATE_OPTIONS: 
TABLE_COMMENT: 

Эта таблица обновляется каждый час с помощью LOAD DATA INFILE, который содержит около 8 тыс. записей.

Время блокировки стола составляет около 30 секунд. Которые соответствуют времени, когда я делаю

mysql> alter table dataFullText drop index title;
Query OK, 79495 rows affected (1.33 sec)
Records: 79495  Duplicates: 0  Warnings: 0

mysql> alter table dataFullText add fulltext index (ref,name,title,description);
Query OK, 79495 rows affected (22.96 sec)
Records: 79495  Duplicates: 0  Warnings: 0

Моя проблема в том, что 30 секунд — это очень долго. Эта таблица запрашивается 5 раз в секунду, в результате чего очередь достигает 30 x 5 = 150 . Поскольку наш максимальный лимит подключений установлен на 100, сервер mysql начинает отклонять некоторые входящие подключения.

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

Есть ли что-нибудь, что я могу сделать, чтобы сократить время, которое mysql использует для обновления индекса?


person Ant    schedule 03.10.2011    source источник
comment
В конце концов я решил использовать Sphinx для всех функций поиска. Я считаю, что это намного быстрее, чем MySQL. Я использую MySQL для хранения и организации своих данных и Sphinx для доступа к ним. MySQL => запись, Sphinx => чтение.   -  person Ant    schedule 16.07.2012


Ответы (1)


В обычной СУБД SQL полное индексирование такой таблицы не поможет. Поскольку индекс на самом деле больше, чем сама таблица, время, необходимое для доступа к нему, будет даже больше, чем время для доступа к таблице без индекса.

Теперь это действительно зависит от конкретной установки: объем оперативной памяти, общая скорость системы. Прежде чем добавлять индексы и, да, обновление/воссоздание индексов происходит медленно, просто убедитесь, что оно того стоит в конкретных условиях, в которых вы находитесь.

person BxlSofty    schedule 08.07.2012