Вопрос по организации полнотекстового поиска в БД

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
goshanecr
сержант
Сообщения: 252
Зарегистрирован: 2008-03-31 15:54:49
Откуда: Пермь, Екатеринбург
Контактная информация:

Вопрос по организации полнотекстового поиска в БД

Непрочитанное сообщение goshanecr » 2011-10-03 17:44:16

Привет всем!
Помогите пожалуйста советом как исправить такую ситуацию:
Есть компьютер Athlon 64 X2 4800, 4Gb RAM, FreeBSD 9.0 Beta3 x64, MySQL 5.5.15
Есть две таблицы:
table_1

Код: Выделить всё

+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| id        | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| msgDate   | int(10) unsigned | NO   |     | NULL    |                |
| msgSource | int(10) unsigned | NO   | MUL | NULL    |                |
| msgStatus | int(10) unsigned | NO   | MUL | 1       |                |
| msgBody   | text             | YES  | MUL | NULL    |                |
| msgLink   | char(255)        | NO   | UNI | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+
table_2

Код: Выделить всё

+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| strHash | char(50)         | NO   | UNI | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
И есть запрос:

Код: Выделить всё

UPDATE	table_1,table_2 SET msgStatus=2
WHERE	LOWER(msgBody) LIKE CONCAT("%",LOWER(strHash),"%")
Смысл запроса в том, что все записи в таблице table_1 в поле msbBody которых есть подстроки из таблицы table_2 пометить определённым образом.
Так вот этот запрос выполняется непомерно долго!
Долго для такой ситуации:
В таблице table_1 - 7000 записей, в таблице table_2 - 70 записей, и когда выполняется запрос, процесс mysqld грузит проц на 100% в течение 30 секунд и с каждыми новыми 10-ю записями в table_2 ситуация усугубляется.
Таблица table_1 : MyISAM, поле msgBody FULLTEXT INDEX.
Вот конфиг my.cnf

Код: Выделить всё

[client]
port                    = 3306
socket                  = /tmp/mysql.sock

[mysqld]
port                    = 3306
socket                  = /tmp/mysql.sock
#skip-locking
skip-networking
disable-log-bin
key_buffer              = 16M
max_allowed_packet      = 1M
table_cache             = 64
sort_buffer_size        = 16M
net_buffer_length       = 8K
read_buffer_size        = 100M
read_rnd_buffer_size    = 100M
myisam_sort_buffer_size = 16M
init_connect            = 'SET NAMES utf8'
#default-character-set   = utf8
character-set-server    = utf8
collation-server        = utf8_general_ci
Что делать? Как исправить и оптимизировать и что конкретно?
Люблю в инете шарить. И браузер мой только Opera !!!
Пользователям стараюсь ставить дистр Ubuntu. Уже 3 человека пересели.
Домашний комп FreeBSD 9.0 amd64
FreeBSD - изменим жизнь к лучшему!

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Electronik
капитан
Сообщения: 1593
Зарегистрирован: 2008-11-15 17:32:56
Откуда: Минск
Контактная информация:

Re: Вопрос по организации полнотекстового поиска в БД

Непрочитанное сообщение Electronik » 2011-10-03 19:20:23

попробуйте создать индексы.
Предскажем будущее hw по логам и дампу, снимем сглаз и порчу с рута, поможем придумать пароль(С)
Блог

FiL
ст. лейтенант
Сообщения: 1375
Зарегистрирован: 2010-02-05 0:21:40

Re: Вопрос по организации полнотекстового поиска в БД

Непрочитанное сообщение FiL » 2011-10-03 19:30:11

во-первых, убрать LOWER. Оно просто не надо, ибо в данном случае сравнение все равно case insensitive.

Аватара пользователя
goshanecr
сержант
Сообщения: 252
Зарегистрирован: 2008-03-31 15:54:49
Откуда: Пермь, Екатеринбург
Контактная информация:

Re: Вопрос по организации полнотекстового поиска в БД

Непрочитанное сообщение goshanecr » 2011-10-03 19:53:37

Electronik писал(а):попробуйте создать индексы.
Индексы создать чего? В первой таблице все поля индексы. Поле msbBody это FULLTEXT(msgBody)
FiL писал(а):во-первых, убрать LOWER. Оно просто не надо, ибо в данном случае сравнение все равно case insensitive.
LOWER убрал, всё без изменений
Люблю в инете шарить. И браузер мой только Opera !!!
Пользователям стараюсь ставить дистр Ubuntu. Уже 3 человека пересели.
Домашний комп FreeBSD 9.0 amd64
FreeBSD - изменим жизнь к лучшему!

FiL
ст. лейтенант
Сообщения: 1375
Зарегистрирован: 2010-02-05 0:21:40

Re: Вопрос по организации полнотекстового поиска в БД

Непрочитанное сообщение FiL » 2011-10-03 23:12:36

а сколько времени выполняется селект по одному хешу?
вот просто взять один из 70-и и сделать

Код: Выделить всё

select msgStatus from table_1 where msgBody LIKE CONCAT("%",strHash,"%") 
И заодно explain на него покажите, плз.
Хотя с текстом чего-то особо быстрого ожидать не приходится :(