Ключевыми словами запроса на обновление


Мой запрос такой:

UPDATE `phrases`
SET `phrases`.`count`=(SELECT COUNT(*) FROM `strings` WHERE `string` LIKE CONCAT('%', `phrases`.`phrase`, '%'))

Мои столы выглядят так:

CREATE TABLE `phrases` (
    `hash` varchar(32) NOT NULL,
    `count` int DEFAULT 0,
    `phrase` text NOT NULL,
     PRIMARY KEY (`hash`),
     KEY(`count`)
)

И

CREATE TABLE `strings` (
    `string` text NOT NULL,
)

ключевыми словами в 18,000 строк и строк имеет 1500 строк.



732
2
задан 20 декабря 2011 в 09:12 Источник Поделиться
Комментарии
2 ответа

Поскольку вы используете как с шаблонами, вы собираетесь сделать стол-сканирование таблиц, выполнив в общей сложности 18000*1500 = 27000000 подстроки сравнения.

Для оптимизации этого, вы должны использовать некоторые технологии полнотекстового индекса. Предлагаю Сфинкса поиск или Апач Солр. Если вы сделаете это, вам не нужно вести подсчет того, сколько игр существует, потому что индекс поиска делает его намного менее дорогим, чтобы получить рассчитывать на спрос.

MySQL также реализует полнотекстовый индекс тип, но он поддерживается только в движок MyISAM системы хранения данных в текущих версиях (до 5,5). Я не рекомендую использовать MyISAM для важных данных.

В MySQL 5.6 разрабатывает полнотекстовый индекс для InnoDB.

4
ответ дан 20 декабря 2011 в 10:12 Источник Поделиться

Вы должны удалить индекс и собирать графов.

Это позволит ускорить обновление графа столбец.

Когда это сделано, поместите указатель обратно.

ALTER TABLE phrase DROP INDEX `count`;
UPDATE phrase SET COUNT=0;
UPDATE phrases INNER JOIN string
ON ( LOCATE(strings.string,phrases.phrase) > 0 )
SET phrase.`count`=phrase.`count`+1;
ALTER TABLE phrase ADD INDEX `count` (`count`);

Это внутреннее соединение-это не более чем декартово произведение (отмечали ответа Билл Karwin по состоянию 27,000,000 строк рассматривается во временной таблице).

Если времени на обработку-то можно жить, все хорошо.

Если времени на обработку катастрофически медленно, вы должны попробовать Билл Karwin ответ.

0
ответ дан 20 декабря 2011 в 10:12 Источник Поделиться