SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.12.2011 00:10:31

lepriconl
Участник
Зарегистрирован: 28.11.2011
Сообщений: 6

Помогите правильно задать запрос....

Есть две таблицы:
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 сек. при тех количествах которые я написал, подскажите как можно это время сократить? может какие настройки сделать? может сам запрос переделать?

Неактивен

 

#2 04.12.2011 00:18:59

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите правильно задать запрос....

Если соединить таблицы через join, то может получиться быстрее.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 04.12.2011 01:12:47

zvv1992
Участник
Зарегистрирован: 03.12.2011
Сообщений: 8

Re: Помогите правильно задать запрос....

Говорю практически рандомно, но индексы тут помогут?

Неактивен

 

#4 04.12.2011 01:27:43

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите правильно задать запрос....

При чем тут рандомно?... Похоже, мы о разном говорим smile.
Индексы помогут на тех полях, через которые будет проводиться соединение (slovo,slovo1,slovo2).
Я имел в виду что-то такое:
select sr.* from slovsoch_rip sr join slovar s on ( sr.slovo1=s.slovo or sr.slovo2=s.slovo)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 04.12.2011 02:12:35

lepriconl
Участник
Зарегистрирован: 28.11.2011
Сообщений: 6

Re: Помогите правильно задать запрос....

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)

Неактивен

 

#6 04.12.2011 02:18:18

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите правильно задать запрос....

1. С каких пор в memory-таблицах невозможно создать индексы?
2. А Ваш вариант запроса работает быстрее, да?..
Приложите архив с дампами обеих Ваших табличек. Есть подозрение, что MySQL неверно составляет план.
И кстати, сравните скорость след. вариантов (с принудительным заданием порядка соединения таблиц)

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. sr - алиас (синоним) для slovsoch_rip. То есть select sr.* означает select slovsoch_rip.* - выбрать все записи из таблицы slovsoch_rip.

Отредактированно deadka (04.12.2011 02:49:07)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 04.12.2011 02:45:52

lepriconl
Участник
Зарегистрирован: 28.11.2011
Сообщений: 6

Re: Помогите правильно задать запрос....

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)

Неактивен

 

#8 04.12.2011 02:49:44

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите правильно задать запрос....

Сори, опечатался, не straight join, а straight_join.
Кстати, индексы для данного запроса лучше делать не bree, a hash.
Ваш архив скачал, как разверну/пощупаю - отпишусь в тред.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 04.12.2011 02:52:04

lepriconl
Участник
Зарегистрирован: 28.11.2011
Сообщений: 6

Re: Помогите правильно задать запрос....

deadka написал:

Сори, опечатался, не straight join, а straight_join.
Кстати, индексы для данного запроса лучше делать не bree, a hash.
Ваш архив скачал, как разверну/пощупаю - отпишусь в тред.

про опечатку я догадался и исправил... но все равно ответа так и не дождался....

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson