[MySQL] =?UTF-8?B?ZMWCdWdpIHVwZGF0ZQ==?=
grzessiek - 11-05-2007 12:32
[MySQL] =?UTF-8?B?ZMWCdWdpIHVwZGF0ZQ==?= witam, mam taką sytuację:
co 15 minut muszę wykonać kasowanie i wstawienie ok. 20 tys. rekordów z jednej tabeli. skrypt, który to robi, ze względu na różne ograniczenia niezwiązane z bazą, wykonuje się ok. 1 minuty.
na tej tabeli działa serwis www. w praktyce, podczas aktualizacji dane są niedostępne (bo wykasowane) lub częściowe - najczęściej jednak niedostępne.
chciałbym tego uniknąć, więc mam pytanie - co można zrobić żeby procedura odświeżania danych była bardziej przyjazna i niezauważalna dla użytkowników serwisu?
obiło mi się o uszy coś takiego jak BLOCK TABLES - czy tu mam szukać?
będę wdzięczny za wszystkie sugestie.
pozdrawiam, g. -- Hotele w Warszawa, Kraków, Wrocław, Szczecin, Poznań http://www.travelguide.pl
Maciek Dobrzanski - 11-05-2007 12:32
=?UTF-8?Q?Re:_=5BMySQL=5D_d=C5=82ugi_update?=
"grzessiek" <mysqld@poczta.onet.pl> wrote in message news:f1eksk$kur$1@news.onet.pl... > > na tej tabeli działa serwis www. w praktyce, podczas aktualizacji dane są > niedostępne (bo wykasowane) lub częściowe - najczęściej jednak > niedostępne.
Użyć innego silnika danych, np. InnoDB, gdzie problem lockowania stanie się znacznie mniej uciążliwy lub zniknie całkowicie.
Albo, zamiast kasować dane co 15 minut, stworzyć jakiś system wersjonowania danych. Do tabeli dopisywać jedynie kolejne rekordy ze zmieniającą się wersją (może to byc poprostu czas i data jeśli jest to wystarczające do rozróżnienia aktualnych od nieaktualnych), w osobnej tabeli trzymać indeks wersji i odczytywać tylko dane z ostatniej. Wówczas stare dane możesz kasować znacznie rzadziej, np. raz na dzień w środku nocy. Dodatkowo, jeśli proces wstawiania danych to spora paczka INSERTów, można się zastanowić nad konfiguracją parametru concurrent inserts (dla MyISAM).
Albo, wykorzystać partycjonowanie danych typu LIST według jednego pola, które będzie zawierać jedynie dwie wartości - 0 i 1. Dane dopisywać naprzemiennie raz z wartością kolumny równą 0, a raz równą 1. Po zakończonym procesie dodawania, druga partycję czyścić (najszybciej - DROP/CREATE).
Możliwości jest pewnie znacznie więcej w zależności od danych i możliwości modyfikacji mechanizmu. To najbardziej ogólne.
Maciek
sg - 11-05-2007 12:32
grzessiek wrote: > > witam, mam taką sytuację: > > co 15 minut muszę wykonać kasowanie i wstawienie ok. 20 tys. rekordów z > jednej tabeli. skrypt, który to robi, ze względu na różne ograniczenia > niezwiązane z bazą, wykonuje się ok. 1 minuty. > > na tej tabeli działa serwis www. w praktyce, podczas aktualizacji dane > są niedostępne (bo wykasowane) lub częściowe - najczęściej jednak > niedostępne. > > chciałbym tego uniknąć, więc mam pytanie - co można zrobić żeby > procedura odświeżania danych była bardziej przyjazna i niezauważalna dla > użytkowników serwisu? > > obiło mi się o uszy coś takiego jak BLOCK TABLES - czy tu mam szukać? > > będę wdzięczny za wszystkie sugestie. >
użyj transakcji i tabel InnoDB, inaczej się nie da
sw - 11-05-2007 12:32
Użytkownik "sg" <alpha@skynet.org.pl_WITHOUT> napisał w wiadomości news:f1en95$hap$1@inews.gazeta.pl... > grzessiek wrote: >> >> witam, mam taką sytuację: >> >> co 15 minut muszę wykonać kasowanie i wstawienie ok. 20 tys. rekordów z >> jednej tabeli. skrypt, który to robi, ze względu na różne ograniczenia >> niezwiązane z bazą, wykonuje się ok. 1 minuty. >> >> na tej tabeli działa serwis www. w praktyce, podczas aktualizacji dane są >> niedostępne (bo wykasowane) lub częściowe - najczęściej jednak >> niedostępne. >> >> chciałbym tego uniknąć, więc mam pytanie - co można zrobić żeby procedura >> odświeżania danych była bardziej przyjazna i niezauważalna dla >> użytkowników serwisu? >> >> obiło mi się o uszy coś takiego jak BLOCK TABLES - czy tu mam szukać?
Nie korzystam z mysql, ale jezeli z obsluguje ona triggery to chyba najlepsze rozwiazanie. Nie taki trigger odklada Ci w innej tablice info o wszystkich rekordach w jakich zaszly zmiany, a potem co 15 minut robisz tylko update rekordow, w ktorych zaszly zmiany i czyscisz ta pomocnicza tabele.
Pozdrawiam SW
Janusz - 11-05-2007 12:32
> co 15 minut muszę wykonać kasowanie i wstawienie ok. 20 tys. rekordów z > jednej tabeli. skrypt, który to robi, ze względu na różne ograniczenia > niezwiązane z bazą, wykonuje się ok. 1 minuty.
stwórz dwie identyczne tabele, a w oprogramowaniu za pomocą jednej zmienne przełączaj je, i masz około 15 minut na modyfikację
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
zanotowane.pldoc.pisz.plpdf.pisz.plnocnerozmowy.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|