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

Форум MySQL

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

 

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

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

тема: Многотабличный UPDATE, mysql 4.024
 
 автор: hars   (29.06.2006 в 13:10)   письмо автору
 
 

имеется три таблицы
1.face -в ней надо произвести обновление
2.prava -данные которые надо перетащить в face
3.face_prava -содержит идентификаторы соответствия таблиц между собой
Запрос не работает,пишет ошибка синтаксиса select

update face set
ser_vd=(select ser from prava,face_prava,face
where prava.sis_num=face_prava.sispr and face_prava.sisfc=face.sis_num ),
num_vd=(select num from prava,face_prava,face
where prava.sis_num=face_prava.sispr and face_prava.sisfc=face.sis_num ),
dat_vyd=(select data_vid from prava,face_prava,face
where prava.sis_num=face_prava.sispr and face_prava.sisfc=face.sis_num ),
srok_deistv=(select srok_deyst from prava,face_prava,face
where prava.sis_num=face_prava.sispr and face_prava.sisfc=face.sis_num ),
kategor=(select kateg from prava,face_prava,face
where prava.sis_num=face_prava.sispr and face_prava.sisfc=face.sis_num ),
stazh=(select otmetki from prava,face_prava,face
where prava.sis_num=face_prava.sispr and face_prava.sisfc=face.sis_num )
where prava.sis_num=face_prava.sispr and face_prava.sisfc=face.sis_num;

Пожалуйста подскажите как лучще сделать и быстрее такую операцию(размер таблиц порядка 500 мегабайт ).

Через скрипт PHP очень долго получится,и если кто знает как можно в поле записать данные из нескольких полей другой таблицы,например :
в поле ФИО tb1 из tb2 фамилия имя отчество по условию совпадения ip к примеру (таблицы порядка гига а то и больше)

   
 
 автор: cheops   (29.06.2006 в 15:28)   письмо автору
 
   для: hars   (29.06.2006 в 13:10)
 

Хм... зря такой запрос с такими объёмами используете... у вас какая цель? Что требуется сделать?

   
 
 автор: hars   (30.06.2006 в 11:18)   письмо автору
 
   для: cheops   (29.06.2006 в 15:28)
 

имеется три таблицы
1.face -в ней надо произвести обновление
2.prava -данные которые надо перетащить в face
3.face_prava -содержит идентификаторы соответствия таблиц между собой

Проще говоря надо из трёх таблиц сделать одну,экономить место нужно,да и быстрее будет запрос выполняться к одной таблице чем к трём.

   
 
 автор: cheops   (30.06.2006 в 11:59)   письмо автору
 
   для: hars   (30.06.2006 в 11:18)
 

Попробуйте следующий запрос
UPDATE face, prava, face_prava 
SET face.ser_vd = prava.ser,
    face.num_vd = prava.num,
    face.dat_vyd = prava.data_vid,
    face.srok_deistv = prava.srok_deyst,
    face.kategor = prava.kateg,
    face.stazh = prava.otmetki
WHERE prava.sis_num=face_prava.sispr AND 
      face_prava.sisfc=face.sis_num;

   
 
 автор: cheops   (30.06.2006 в 12:00)   письмо автору
 
   для: cheops   (30.06.2006 в 11:59)
 

А ещё лучше по частям его осуществляйте т.е. добавьте в WHERE-условие оганичение скажем сначала обработайте первые 10000 записей, потом следующие 10000 и т.д.

   
 
 автор: hars   (30.06.2006 в 12:04)   письмо автору
 
   для: cheops   (30.06.2006 в 12:00)
 

спасибо сейчас попробую

   
 
 автор: hars   (30.06.2006 в 12:36)   письмо автору
 
   для: cheops   (30.06.2006 в 12:00)
 

Поставил обрабатывать 100 записей запрос выполняется уже 6 минут и до сих пор,посылал из командной строки.Может есть какой-то другой альтернативный метод,с тем же результатом? (размер face 1.3 гига)

.......WHERE face.sis_num<100 and prava.sis_num=face_prava.sispr AND
face_prava.sisfc=face.sis_num;

   
 
 автор: hars   (30.06.2006 в 14:16)   письмо автору
 
   для: cheops   (30.06.2006 в 12:00)
 

видимо Update не подходит ,пытался выполнить запрос на обновление одной строки,mysql забирает весь проц ,может проще создать новую таблицу,но тогда опять же данные надо как то вытаскивать,а их много.Замкнутый круг какой-то получается :(

   
 
 автор: hars   (30.06.2006 в 15:01)   письмо автору
 
   для: hars   (30.06.2006 в 14:16)
 

Попробую перенести только идентификатор соответствия (из одной в другую),возможно так будет быстрее.
Кто знает как лучше работать с большими БД(1 и более гига),помогите пожалуйста.
Или стоит вообще использовать другую БД?!

   
 
 автор: cheops   (30.06.2006 в 18:41)   письмо автору
 
   для: hars   (30.06.2006 в 14:16)
 

Напомните размеры таблиц - какая таблица сколько места занимает?

   
 
 автор: hars   (30.06.2006 в 18:49)   письмо автору
 
   для: cheops   (30.06.2006 в 18:41)
 

В данном конкретном случае
face 179 Mb
face_prava 136 Mb
prava 304 Mb

   
 
 автор: hars   (03.07.2006 в 16:46)   письмо автору
 
   для: hars   (30.06.2006 в 18:49)
 

Задача выполнена.
Было сделано:
1, Оптимизирован запрос(огромное спасибо cheops )
2, Расширил буфер памяти до 100 метров (set-variable=key_buffer=100M ,прописывается в my.ini)
3, Проиндексировал поля по которым осуществлялась идентификация
Время выполнения составило порядка 40 минут,уже неплохо( celeron 1.7G / 382 Mb).

Всё же если кто знает как слить 2 и более столбца в один ,запросом(и) или залить из файла три столбца в один ,подскажите,т.к. лопатить с помощью PHP 410 Mb что то не очень хочется,это ОЧЕНЬ долго,и может повиснуть и всё что угодно.
Заранее спасибо.

   
Rambler's Top100
вверх

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