Задавайте вопросы, мы ответим
Вы не зашли.
Есть две таблицы:
1. slovsoch_rip тип таблицы - MEMORY, структура таблицы:
| id | slovo1 | slovo2 |
| 1 | хлеб | торт |
| 2 | пыпп | sdfgg |
| 3 | 45кку | 3223 |
| 4 | вапа | торт |
и т.д. так 400 000 записей, записи абсолютно разные, и набор букв, и цифры, и известные нам слова
2. slovar тип таблицы MyISAM, структура таблицы
| id | slovo |
| 1 | хлеб |
| 2 | торт |
| 3 | квас |
| 4 | сало |
и т.д. так 1 300 000 записей, все строки - это список слов и словоформ
Делаю вот такой вот запрос...
$rq = "SELECT * from slovsoch_rip where ((slovsoch_rip.slovo1=ANY (select slovo from slovar)) and (slovsoch_rip.slovo2=ANY (select slovo from slovar)))";
чего я этим хочу добиться, чтобы он мне нашел ту строку(строки) в таблице slovsoch_rip, в которой оба слова совпадут со строками в таблице slovo, в этом примере это строка 1, т.к. слово "хлеб" есть в таблице slovar и слово "торт" тоже есть... этот запрос обрабатывается у меня порядка 10 сек. при тех количествах которые я написал, подскажите как можно это время сократить? может какие настройки сделать? может сам запрос переделать?
Неактивен
Если соединить таблицы через join, то может получиться быстрее.
Неактивен
Говорю практически рандомно, но индексы тут помогут?
Неактивен
При чем тут рандомно?... Похоже, мы о разном говорим .
Индексы помогут на тех полях, через которые будет проводиться соединение (slovo,slovo1,slovo2).
Я имел в виду что-то такое:
select sr.* from slovsoch_rip sr join slovar s on ( sr.slovo1=s.slovo or sr.slovo2=s.slovo)
Неактивен
1. индексы в таблице slovsoch_rip невозможны т.к. таблица MEMORY
2. select sr.* from slovsoch_rip sr join slovar s on ( sr.slovo1=s.slovo or sr.slovo2=s.slovo) чтото это запрос не работает, я его запустил, он проц нагрузил на максимум, но я так и не смог дождаться никакого результата...((( в логах пусто, ни ошибок ничего....
3. что в этом запросе означает sr.*?
Отредактированно lepriconl (04.12.2011 02:13:24)
Неактивен
1. С каких пор в memory-таблицах невозможно создать индексы?
2. А Ваш вариант запроса работает быстрее, да?..
Приложите архив с дампами обеих Ваших табличек. Есть подозрение, что MySQL неверно составляет план.
И кстати, сравните скорость след. вариантов (с принудительным заданием порядка соединения таблиц)
Отредактированно deadka (04.12.2011 02:49:07)
Неактивен
1. Сори, то я конечно протупил.... но сделав индексы на оба поля, выходит дольше... скорее всего я гдето туплю...
2. Мой вариант запроса делает все с таблицей... чуть больше чем за 2 сек. Архив с обоими таблицами, в таблицу slovsoch_rip добавил индексы, видать добавил как то не так...
http://www.ex.ua/get/19885500
select sr.* from slovsoch_rip sr STRAIGHT_JOIN slovar s on ( sr.slovo1=s.slovo or sr.slovo2=s.slovo) - итога не дождался....
select sr.* from slovar s STRAIGHT_JOIN slovsoch_rip sr on ( sr.slovo1=s.slovo or sr.slovo2=s.slovo) - итога не дождался
3. Все понял...
Отредактированно lepriconl (04.12.2011 02:50:26)
Неактивен
Сори, опечатался, не straight join, а straight_join.
Кстати, индексы для данного запроса лучше делать не bree, a hash.
Ваш архив скачал, как разверну/пощупаю - отпишусь в тред.
Неактивен
deadka написал:
Сори, опечатался, не straight join, а straight_join.
Кстати, индексы для данного запроса лучше делать не bree, a hash.
Ваш архив скачал, как разверну/пощупаю - отпишусь в тред.
про опечатку я догадался и исправил... но все равно ответа так и не дождался....
Неактивен