У меня есть две таблицы, каждая из которых имеет более 20 миллионов записей; table1 - это список терминов, а таблица2 - список ключевых слов, которые могут появляться или не отображаться в этих терминах. Мне нужно определить термины, содержащие ключевое слово.
Поле «термин» - это VARCHAR (320), а поле «keyword» - VARCHAR (64).mysql - фильтрация списка против ключевых слов, списка и ключевых слов> 20 миллионов записей (медленных)
Моя текущая стратегия:
SELECT table1.term, table2.keyword FROM table1 INNER JOIN table2 ON table1.term
LIKE CONCAT('%', table2.keyword, '%');
Это не работает, он принимает е о р е v е р.
Это не сервер, афайк (см. Примечания).
Как я могу переписать это так, чтобы он работал в течение дня?
Я развлекал таблицы в памяти или менялся на innodb и делал буферный пул достаточно большим, чтобы удерживать обе таблицы. К сожалению, каждый поток mysql связан с одним процессором, но у меня есть 4 ядра (ну, «8» с гиперпотоком); если бы я мог распределить рабочую нагрузку, это было бы фантастически.
Примечания:
Что касается оптимизации сервера: обе таблицы MyISAM и имеют уникальные индексы по совпадающему полей; буфер ключа myisam больше, чем сумма обоих размеров файлов индекса, и он даже не облагается полностью (
key_blocks_unused
... большой); сервер представляет собой 2x двухъядерный xeon 2U beast с быстрыми дисками sas и 8G RAM, настроенный для рабочей нагрузки mysql.Я только что вспомнил, что я только индексирую первые 80 символов поля «термин» (чтобы сохранить дисковое пространство); не уверен, что это больно или помогает.
MySQL 5.0.32, Debian Lenny x86_64
Индекс по сроку не будет использоваться в запросе LIKE, таком как ваш, так что это не имеет значения. Поскольку вы по существу просматриваете каждое ключевое слово, индекс на этом тоже не имеет значения. –
Будет ли регулярное выражение быть быстрее, чем LIKE? – mikewaters
конечно - нет. – zerkms