ресурсоемкий запрос

ReMaRk

Новичок
ресурсоемкий запрос

Есть две таблицы: в одной хранятся описания товаров, в другой предметный указатель...
CREATE TABLE good(
goodid INT(4) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
description CHAR(255),
mu CHAR(16),
price CHAR(16),
company CHAR(64),
phone CHAR(32),
INDEX (description(16))
);
CREATE TABLE word(
wordid INT(4) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
word CHAR(64),
INDEX (word(16))
);
например в первой таблице может в поле "description" может храниться "Аксессуары для жидких обоев", а во второй в поле "word" - слово "аксессуар".
в первой тиблице строк порядка 3-4 тысяч, во второй 1600 строк...
запрос типа:
SELECT a.catalogid, a.description, a.measurement, a.price, a.company, a.phone, IFNULL(b.word, '') AS keyword
FROM catalog.work AS a LEFT JOIN catalog.word AS b ON (a.description LIKE CONCAT(b.word, '%'))
GROUP BY a.catalogid
ORDER BY a.description
выполняется порядка 30 сек. что очень долго. Знаю что join очень ресурсоемкая операция... как можно было бы оптимизировать этот запрос???
 

ReMaRk

Новичок
если я что то не понимаю, но я создал при создании таблицы индексы... или вы что то другое имели ввиду?
 

tony2001

TeaM PHPClub
внимательней посмотри - у тебя только примари кеи указаны.
 

chira

Новичок
Прочитай свое описание ...
Есть две таблицы:
... good , word

в запросе у тебя work , word и не описанные поля a.catalogid, a.measurement

По моему разумению должно быть три таблицы:
1.товары с description
2.список слов встречающихся в description
3.таблица связей между первыми двумя таблицами

Ты при выборке пытаешься определить, какие же слова встречаются в description. Это нужно делать на этапе вставки/редактирования записи. Тогда будет все летать при выборке.
 

ReMaRk

Новичок
я немного с названиями всех запутал...
таблица называется work с описанием товаров... и есть предметный указатель, word... вот эти связи мне и нужно найти этим запросом... но только не совсем связи, а конкретное слово привязать
 

chira

Новичок
Ты можешь реализовать мое предложение и посмотреть результат? Или не понимаешь как это сделать?
 

ReMaRk

Новичок
в исходных данных нет такого... в исходных данных мы обладаем двумя таблицами... work и word
и нужно их склеить... так чтоб каждой записи из таблице work сопоставлялось слово из таблицы word, если нету такого слова в таблице word - значит пустая строка... есть запрос который все это замечательно делает, но очень медленно... как его оптимизировать?
 
Сверху