Страница 1 из 1

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

Добавлено: 2011-10-03 17:44:16
goshanecr
Привет всем!
Помогите пожалуйста советом как исправить такую ситуацию:
Есть компьютер 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
Что делать? Как исправить и оптимизировать и что конкретно?

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

Добавлено: 2011-10-03 19:20:23
Electronik
попробуйте создать индексы.

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

Добавлено: 2011-10-03 19:30:11
FiL
во-первых, убрать LOWER. Оно просто не надо, ибо в данном случае сравнение все равно case insensitive.

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

Добавлено: 2011-10-03 19:53:37
goshanecr
Electronik писал(а):попробуйте создать индексы.
Индексы создать чего? В первой таблице все поля индексы. Поле msbBody это FULLTEXT(msgBody)
FiL писал(а):во-первых, убрать LOWER. Оно просто не надо, ибо в данном случае сравнение все равно case insensitive.
LOWER убрал, всё без изменений

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

Добавлено: 2011-10-03 23:12:36
FiL
а сколько времени выполняется селект по одному хешу?
вот просто взять один из 70-и и сделать

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

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