|
|
|
| Здравствуйте. Вам может мой вопрос показаться каким то странным, но мне это важно знать. В инете найти вмияемого ответа не смог.
Можно ли за один запрос в mysql добавить данные сразу к нескольким таблицам?
Дело в том, что я пишу скрипт, который должен добавлять инфу в один из CMS. Стала следующая проблема. Сколько я смогу сделать за секудну запросов к mysql, чтоб не положить сервер? На основе этого я предположил, что запросов должно быть как можно меньше. | |
|
|
|
|
|
|
|
для: Niklao
(05.06.2013 в 17:56)
| | В принципе - можете.
Но я ни разу не встречал ситуацию, в которой это было бы удобно.
Хотя, возможно, просто не обращал внимания.
Вообще, синтаксис UPDATE-запроса позволяет выполнять многотабличные обновления, и вы можете использовать что-то вроде:
UPDATE table1 as t1
, table2 as t2
SET t1.name='new_name'
, t2.adress='new_adress'
WHERE /* вот тут самое интересное */
t1.id=1 AND t2.id=2
|
А интересно то, что в условии WHERE вам нужно будет однозначно определить что нужно обновлять, а что не нужно.
И определить не по двум отдельным таблицам, а по одной общей, которую вы можете увидеть, выполнив запрос:
SELECT *
FROM table1 as t1
, table2 as t2
|
А чтобы увидеть какие строки будут обновлены, можно выполнить запрос
SELECT *
FROM table1 as t1
, table2 as t2
WHERE
t1.id=1 AND t2.id=2
|
И вот в таком виде, когда идет безусловное CROSS JOIN объединение двух таблиц и однозначная идентификация строки по двум первичным ключам, результат будет именно таким, как и ожидается - в каждой таблице обновится по одной строке.
Но стоит вам заменить, скажемна
t2.last_update>'2013-06-01'
| и результат будет совершенно не предсказуем.
Вернее он предсказуем, но природу этого обновления нужно очень хорошо понимать.
Т.е. написав запрос:
UPDATE table1 as t1
, table2 as t2
SET t1.name='new_name'
, t2.adress='new_adress'
WHERE
t1.id=1 AND t2.last_update>'2013-06-01'
|
Вы скорее всего ожидаете что в table1 обновится запись с id=1, а в table2 обновятся записи с t2.last_update>'2013-06-01'.
Но это будет далеко не так!
Выполнив запрос:
SELECT *
FROM table1 as t1
, table2 as t2
WHERE
t1.id=1 AND t2.last_update>'2013-06-01'
| вы увидите какие данные будут обновлены.
И скорее всего, некоторые значения во время такого запроса будут перезаписаны несколько раз.
А, как следствие, не факт, что вы на такой экономии количества запросов, на самом деле сэкономите процессорное время. | |
|
|
|
|
|
|
|
для: Sfinks
(05.06.2013 в 19:29)
| | Интересно, почему я прочитал слова "добавить данные" и подумал про UPDATE?
Не знаю.
Но раз уж написал такую лекцию, стирать не буду =)
Отвечая на изначальный вопрос - НЕТ. Многотабличного инсерта не бывает.
Но бывает многострочный. Т.е. для того, чтобы добавить в 2 таблицы по 50 строк, вы можете выполнить не 100 запросов, а всего 2. | |
|
|
|
|
|
|
|
для: Sfinks
(05.06.2013 в 19:38)
| | Это как раз я понимаю и знаю. Но вот нюансы... Ведь в phpmyadmin можно сделать запрос в который будет UPDATE данных в одну и больше таблиц. | |
|
|
|
|
|
|
|
для: Niklao
(05.06.2013 в 19:48)
| | Они разделены запятыми, фактически выполняются каждый по отдельности. Одним запросом нельзя, но можно написать функцию, которая будет как в phpMyAdmin обрабатывать множество запросов - разбивать и выполнять их по-отдельности. | |
|
|
|
|
|
|
|
для: Niklao
(05.06.2013 в 17:56)
| | Спасибо за ответы.
А какое количество запросов в БД точно не положит сервер? | |
|
|
|
|
|
|
|
для: Niklao
(05.06.2013 в 17:56)
| | На самом деле просто мне надо совершить около 10-15 запросов в одну секунду. Половина из которых проверяет в разных таблицах, нет ли таких данных. А другая половина запросов, это как раз update. | |
|
|
|
|
|
|
|
для: Niklao
(05.06.2013 в 19:50)
| | Не парьтесь на эту тему раньше времени.
На этот вопрос нельзя однозначно ответить.
Слишком много факторов влияет: сложность запроса, размер и тип таблиц, наличие индексов, мощность сервера и т.д. и т.п.
Не возможно рассчитать нагрузку на этапе проектирования.
Пишите, пользуйтесь, ведите статистику. А вот если уже возникнут проблемы - тогда нужно будет оптимизировать запросы.
То, что 10-15 не сложных запросов в секунду на не особо больших таблицах не положат сервер - могу сказать с вероятностью 99.99%.
Вы недооцениваете современные сервера.
Я недавно выяснил, что у меня в нескольких неудачных операциях выполняется 900-4000 запросов за раз.... И выполняется это от 0.08 до 0.35 секунды. И это все безобразие даже не на VDS, а на обычном хостинге. | |
|
|
|
|
|
|
|
для: Sfinks
(05.06.2013 в 20:37)
| | Спасибо большое. Вы меня успокоили. Думаю, надо на всяки пожарный обратиться в техподдержку на хостинге. | |
|
|
|
|
|
|
|
для: Niklao
(05.06.2013 в 20:56)
| | Когда возникнут затруднения со скоростью они могут не помочь ничем, кроме предложения перейти на более дорогой тариф. Хотя в большинстве случаев можно довольно долго повышать производительность различными ухищрениями, в крайней случае перейти на репликацию, построив распределенную базу данных. Люди обслуживают терабайтные базы, в общем сначала создайте базу, на самом деле профессионалы заранее никогда ничего не оптимизируют - очень сложно просчитать, исследуют уже базу данных под нагрузкой. | |
|
|
|