LINUX.ORG.RU

Как сделать правильно такие запросы к mysql?

 , ,


0

1

Есть таблицы типа:

Main с полями id, item1Id, item2Id, timestamp, ......

item1 с полями id, name, synonym1, synonym2, .....

item2 с полями id, name, synonym1, synonym2, .....


Так вот запрос такой: надо проверять есть ли поля с такими именами в item1 и item2 и если есть, то получать id поля и вставлять все в Main.

Как такое реализовать? По простому через цепочку селектов - страшно медленно и глючно (периодически падает), т.к. itemX поболее двух (5 шт.)
Триггеры? Но тогда, я понимаю, надо делать еще одну таблицу типа main_raw, где вместо id будут item name. Или как? Прошу помощи у ЛОРа.

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

Индексы на что есть? Откуда взялась цепочка селектов если он там один?

anonymous
()
Ответ на: комментарий от anonymous

select id from item1 where name = ...
проверка на непустой ответ, запись в переменную
select id from item2 where name = ...
проверка на непустой ответ, запись в переменную

insert в Main

name в разных item разные

а чем индексы помогут?

Qwentor ★★★★★
() автор топика
Последнее исправление: Qwentor (всего исправлений: 2)
Ответ на: комментарий от Qwentor

select id from item1 where name = ...

проверка на непустой ответ, запись в переменную select id from item2 where name = ... проверка на непустой ответ, запись в переменую

Наркоман штоле?

а чем индексы помогут?

А ты почитай что такое индексы. И заодно подумай, чем тебе триггеры помогут

anonymous
()
Ответ на: комментарий от Qwentor

man inner join

Плюс ты можешь делать SELECT прямо в INSERT. Тебе достаточно одного запроса без переменных и проверок.

Какие, к чёрту, триггеры?

x3al ★★★★★
()
Ответ на: комментарий от anonymous

Он хочет вставлять только если оно есть в обеих таблицах, поэтому и join, чтобы не вставлять, когда хоть в одной из них нет.

x3al ★★★★★
()
Ответ на: комментарий от x3al

не вставлять, когда хоть в одной из них нет

Родина дала им where .. and, пользуйся - не хочу, хочу жрать джоины по неидексированным полям несвязанных таблиц. И это разработчики?

anonymous
()
Ответ на: комментарий от anonymous

Таблицы связанные. В поле itemXid можно вставить только имеющийся id из таблицы itemX (внешние ключи) Все поля itemXid индексированы

Qwentor ★★★★★
() автор топика
Последнее исправление: Qwentor (всего исправлений: 1)
Ответ на: комментарий от x3al

Он сам писал, что не знает, чем там помогут индексы => их там нет.

А говорить, что вариант с несколькими селектами не быстрее джоина может говорить только человек, не понимающий, как работает джоин: он сначала сматчит все name из всех таблиц в одну, а только потом сделает селект из получившегося монстра. Догадаешься, сколько операций поиска и сравнения при этом случится?

//hint: овердохуя

anonymous
()
Ответ на: комментарий от Qwentor

item1 с полями id, name, synonym1, synonym2, .....

item2 с полями id, name, synonym1, synonym2, .....

name в разных item разные

поле itemXid можно вставить только имеющийся id из таблицы itemX (внешние ключи)

Ты определись уже

anonymous
()
Ответ на: комментарий от anonymous

Ты определись уже

В таблице Main все поля itemXid индексированы и связаны с оответствующими полями id из таблиц itemX, соответственно, если попытаться вставить в поле itemXid значение, отсутствующее в таблице itemX - должна быть ошибка.

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Допустим, я вставляю значение item1 = 'foo2'. Соответственно сначала нужно найти foo2 в таблице item1, получить его id и вставить в Main. Также с item2, 3, 4 , 5 со своими значениями

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от anonymous

А говорить, что вариант с несколькими селектами не быстрее джоина может говорить только человек, не понимающий, как работает джоин: он сначала сматчит все name из всех таблиц в одну, а только потом сделает селект из получившегося монстра. Догадаешься, сколько операций поиска и сравнения при этом случится?

Только что проверил EXPLAIN по INNER JOIN vs SELECT: cost от INNER JOIN ровно в 2 раза больше, чем 1 SELECT. Конечно, индексированное поле..

x3al ★★★★★
()
Ответ на: комментарий от Qwentor

Допустим, я вставляю значение item1 = 'foo2'. Соответственно сначала нужно найти foo2 в таблице item1, получить его id

2 id. У тебя уже есть один и второй ты только что вставил

Также с item2, 3, 4 , 5 со своими значениями

ДА ТЫ ЖЕ ТУПОЙ СУКА ТУПОЙ куда и что ты вставляешь? В какую таблицу?

anonymous
()
Ответ на: комментарий от anonymous

Оно и на пяти будет не медленнее. По крайней мере в постгресах, mysql под рукой нет, чтобы проверить.

x3al ★★★★★
()

Как из этого сделать что-то быстрое не знаю, но предлагаю альтернативу: можно вместо кучи таблиц итемов сделать одну таблицу items с дополнительным полем, например, item_type. И тогда можно искать по одной таблице: select from items where name = 'name', а при инсерте добавлять тип записи: item_type = 1 или 2. Селектить так наверняка будет быстрее, чем с join'ами и прочим.

Romaboy
()
Ответ на: комментарий от Romaboy

Короче, сделал просто одним запросом - засунул все запросы select внутрь insert - стало серьезно быстрее

Qwentor ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.