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

Форум MySQL

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

 

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

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

тема: Как сделать самообновление таблицы?
 
 автор: Владимир55   (19.03.2009 в 12:08)   письмо автору
 
 

Таблица rating_sum содержит поля id, str, pos, prod, в которых хранится информация об идентификаторе, имене страницы, количестве её посетителей и количестве продаж с этой страницы за все время набора статистики ДО сегодняшнего дня.

В таблице rating_seg содержится та же информация, но только ЗА сегодняшний день.

И возникает задача прибавить содержимое строк таблицы rating_seg к содержимому строк таблицы rating_sum.

Для этого я поочередно перебираю все строки таблицы rating_seg и для каждого значения имени страницы str ищу строку с этим именем в таблице rating_sum.

Если такой строки в таблице rating_sum нет, то создаю в этой таблице новую строку и заношу в нее данные str, pos и prod из таблицы rating_seg.

Если в таблице rating_sum строка с именем str есть, то считываюиз нее значения pos и prod, прибавляю к каждому из них соответстсвующее значение из таблицы rating_seg и обновляю содержимое этой строки в таблице rating_sum.

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

Как бы это осуществить?

  Ответить  
 
 автор: Владимир55   (23.03.2009 в 00:24)   письмо автору
 
   для: Владимир55   (19.03.2009 в 12:08)
 

Нет такой возможности?

  Ответить  
 
 автор: а-я   (23.03.2009 в 06:09)   письмо автору
 
   для: Владимир55   (19.03.2009 в 12:08)
 

Ммм… А что Вам мешает сделать это все в одной таблице..?
Прибавлять как за сегодня, так и всего, а в нужное время просто обнулить все счетчики за сегодня?

  Ответить  
 
 автор: Владимир55   (23.03.2009 в 13:40)   письмо автору
 
   для: а-я   (23.03.2009 в 06:09)
 

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

  Ответить  
 
 автор: а-я   (23.03.2009 в 14:05)   письмо автору
 
   для: Владимир55   (23.03.2009 в 13:40)
 

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

INSERT INTO 
 `tbl` (...)
SELECT 
 (...) 
FROM `tbl_2`
 ON DUPLICATE KEY UPDATE ...


в одной таблице на id ставите первичный ключ,
во 2ой табл. на id ставите уникальный ключ

  Ответить  
 
 автор: Trianon   (23.03.2009 в 14:22)   письмо автору
 
   для: а-я   (23.03.2009 в 14:05)
 

хм.. а на второй почему первичный не поставить?

  Ответить  
 
 автор: а-я   (23.03.2009 в 14:36)   письмо автору
 
   для: Trianon   (23.03.2009 в 14:22)
 

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

  Ответить  
 
 автор: Владимир55   (23.03.2009 в 15:00)   письмо автору
 
   для: а-я   (23.03.2009 в 14:36)
 

Такая задача у меня встречается очень часто, и потому очень хотелось бы научиться ее корректно решать.

Не могли бы Вы объяснить это поподробнее?

  Ответить  
 
 автор: а-я   (23.03.2009 в 16:05)   письмо автору
 
   для: Владимир55   (23.03.2009 в 15:00)
 

у Вас есть поле `str` - это как я понял название страницы. так?
оно у Вас уникально?

Просто по id группировать и переносить, скорее всего, будет неправильно.

Т.к. Вы хотите одну таблицу сделать маленькой.. и после переноса полностью очищать.. так?

Тогда при записи, Вам придется ориентироваться по 2ой таблице, чтоб узнать id той или иной записи.. В чем и получаем еще хуже эффект.

Вам надо по URL или по названию, лучше использовать их хэш, записывать в маленькую.. а потом все переносить, и если такой же хэш уже будет в основной табл., просто прибавлять счетчики.. если нет, то записываем как новую запись…

ну.. я бы так сделал.. не знаю, насколько это правильно..

  Ответить  
 
 автор: Trianon   (23.03.2009 в 15:04)   письмо автору
 
   для: а-я   (23.03.2009 в 14:36)
 

уникальный ключ позволит Вам добавлять в таблицу строки с незаданным (null) значением ключа.
первичный - не позволит.
Фактически здесь отношение 1:1 - значит в обеих таблицах ключ можно объявить первичным.
Понятно, что минимум в одной из них он тут же окажется чужим - там где будет не задаваться auto_increment, а браться из другой таблицы..

  Ответить  
 
 автор: а-я   (23.03.2009 в 15:56)   письмо автору
 
   для: Trianon   (23.03.2009 в 15:04)
 

т.е. Вы хотели сказать, что надо дать и там и там первичный ключ, но только в одном использовать auto_increment?

но все же до меня не доходит как-то.. если в первой стоит первичный + auto_increment, то мы уже избегаем попадания id = NULL
или я что-то не понял...

  Ответить  
 
 автор: Trianon   (23.03.2009 в 16:08)   письмо автору
 
   для: а-я   (23.03.2009 в 15:56)
 

>т.е. Вы хотели сказать, что надо дать и там и там первичный ключ, но только в одном использовать auto_increment?
да.

>но все же до меня не доходит как-то.. если в первой стоит первичный + auto_increment, то мы уже избегаем попадания id = NULL

избегаем при вставке новой записи, но никак не при update

Кроме того избегать-то избегаем, но и требуемое значение тоже не помещаем, а это ничуть не лучше.

  Ответить  
 
 автор: а-я   (23.03.2009 в 16:19)   письмо автору
 
   для: Trianon   (23.03.2009 в 16:08)
 

Да, в этом Вы правы.
=) как всегда..

  Ответить  
 
 автор: Владимир55   (23.03.2009 в 16:32)   письмо автору
 
   для: а-я   (23.03.2009 в 16:19)
 

Думал-думал я целый час, но так и не врубился: да, str представляет собой имена страниц и этот параметр уникален, а потому его можно использовать как ключ, связывающий обе таблицы некоей закономерностью. Можно то можно, но как? Каким все-таки образом формируется запрос-обновление? Вот что практически то?

  Ответить  
 
 автор: а-я   (23.03.2009 в 16:58)   письмо автору
 
   для: Владимир55   (23.03.2009 в 16:32)
 

ну..сделайте поле `hash_title` varchar(32) UNIQUE KEY
и записывайте туда md5($title)

  Ответить  
 
 автор: Владимир55   (23.03.2009 в 19:23)   письмо автору
 
   для: а-я   (23.03.2009 в 16:58)
 

Я не про тайтлы. Я про то, как предложенный Вами код
INSERT INTO  
 `tbl` (...) 
SELECT  
 (...)  
FROM `tbl_2` 
 ON DUPLICATE KEY UPDATE 
из его общего вида превратить в практически действующий.

  Ответить  
 
 автор: а-я   (23.03.2009 в 19:40)   письмо автору
 
   для: Владимир55   (23.03.2009 в 19:23)
 

Я Вам и говорю, чтоб сработал
ON DUPLICATE KEY UPDATE
надо уникальное поле. по id я Вам описал почему не стоит делать...
поэтому используйте хэш тайтла..

  Ответить  
 
 автор: Владимир55   (23.03.2009 в 23:43)   письмо автору
 
   для: а-я   (23.03.2009 в 19:40)
 

Так я ничего и не понял..
Похоже, не судьба.

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

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