Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подскажите по mysql
 
 автор: Niklao   (05.06.2013 в 17:56)   письмо автору
 
 

Здравствуйте. Вам может мой вопрос показаться каким то странным, но мне это важно знать. В инете найти вмияемого ответа не смог.

Можно ли за один запрос в mysql добавить данные сразу к нескольким таблицам?
Дело в том, что я пишу скрипт, который должен добавлять инфу в один из CMS. Стала следующая проблема. Сколько я смогу сделать за секудну запросов к mysql, чтоб не положить сервер? На основе этого я предположил, что запросов должно быть как можно меньше.

  Ответить  
 
 автор: Sfinks   (05.06.2013 в 19:29)   письмо автору
 
   для: 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.id=2
на
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:38)   письмо автору
 
   для: Sfinks   (05.06.2013 в 19:29)
 

Интересно, почему я прочитал слова "добавить данные" и подумал про UPDATE?
Не знаю.
Но раз уж написал такую лекцию, стирать не буду =)

Отвечая на изначальный вопрос - НЕТ. Многотабличного инсерта не бывает.
Но бывает многострочный. Т.е. для того, чтобы добавить в 2 таблицы по 50 строк, вы можете выполнить не 100 запросов, а всего 2.

  Ответить  
 
 автор: Niklao   (05.06.2013 в 19:48)   письмо автору
 
   для: Sfinks   (05.06.2013 в 19:38)
 

Это как раз я понимаю и знаю. Но вот нюансы... Ведь в phpmyadmin можно сделать запрос в который будет UPDATE данных в одну и больше таблиц.

  Ответить  
 
 автор: cheops   (05.06.2013 в 22:15)   письмо автору
 
   для: Niklao   (05.06.2013 в 19:48)
 

Они разделены запятыми, фактически выполняются каждый по отдельности. Одним запросом нельзя, но можно написать функцию, которая будет как в phpMyAdmin обрабатывать множество запросов - разбивать и выполнять их по-отдельности.

  Ответить  
 
 автор: Niklao   (05.06.2013 в 19:44)   письмо автору
 
   для: Niklao   (05.06.2013 в 17:56)
 

Спасибо за ответы.
А какое количество запросов в БД точно не положит сервер?

  Ответить  
 
 автор: Niklao   (05.06.2013 в 19:50)   письмо автору
 
   для: Niklao   (05.06.2013 в 17:56)
 

На самом деле просто мне надо совершить около 10-15 запросов в одну секунду. Половина из которых проверяет в разных таблицах, нет ли таких данных. А другая половина запросов, это как раз update.

  Ответить  
 
 автор: Sfinks   (05.06.2013 в 20:37)   письмо автору
 
   для: Niklao   (05.06.2013 в 19:50)
 

Не парьтесь на эту тему раньше времени.
На этот вопрос нельзя однозначно ответить.
Слишком много факторов влияет: сложность запроса, размер и тип таблиц, наличие индексов, мощность сервера и т.д. и т.п.
Не возможно рассчитать нагрузку на этапе проектирования.
Пишите, пользуйтесь, ведите статистику. А вот если уже возникнут проблемы - тогда нужно будет оптимизировать запросы.

То, что 10-15 не сложных запросов в секунду на не особо больших таблицах не положат сервер - могу сказать с вероятностью 99.99%.
Вы недооцениваете современные сервера.
Я недавно выяснил, что у меня в нескольких неудачных операциях выполняется 900-4000 запросов за раз.... И выполняется это от 0.08 до 0.35 секунды. И это все безобразие даже не на VDS, а на обычном хостинге.

  Ответить  
 
 автор: Niklao   (05.06.2013 в 20:56)   письмо автору
 
   для: Sfinks   (05.06.2013 в 20:37)
 

Спасибо большое. Вы меня успокоили. Думаю, надо на всяки пожарный обратиться в техподдержку на хостинге.

  Ответить  
 
 автор: cheops   (05.06.2013 в 22:19)   письмо автору
 
   для: Niklao   (05.06.2013 в 20:56)
 

Когда возникнут затруднения со скоростью они могут не помочь ничем, кроме предложения перейти на более дорогой тариф. Хотя в большинстве случаев можно довольно долго повышать производительность различными ухищрениями, в крайней случае перейти на репликацию, построив распределенную базу данных. Люди обслуживают терабайтные базы, в общем сначала создайте базу, на самом деле профессионалы заранее никогда ничего не оптимизируют - очень сложно просчитать, исследуют уже базу данных под нагрузкой.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования