Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jak najwydajniej przerzucić tabelę między bazami?
nexis
post
Post #1





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

Ostrzeżenie: (0%)
-----


Mam dwie bazy danych, działające na tym samym serwerze. Pierwsza baza ma następującą tabelę:
  1. CREATE TABLE `sklep_parametr` (
  2. `produkt` varchar(32) NOT NULL,
  3. `nazwa` varchar(255) NOT NULL,
  4. `opis` varchar(255) NOT NULL,
  5. `jm` varchar(16) NOT NULL
  6. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;

którą chcę przerzucić do drugiej bazy danych o trochę odmiennej budowie tabeli:
  1. CREATE TABLE `parameter` (
  2. `product_code` varchar(255) collate utf8_polish_ci NOT NULL,
  3. `id` int(11) NOT NULL AUTO_INCREMENT,
  4. `key` varchar(255) collate utf8_polish_ci NOT NULL,
  5. `value` varchar(255) collate utf8_polish_ci NOT NULL,
  6. PRIMARY KEY (`id`),
  7. KEY `product_code` (`product_code`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

Relacje mają być następujące:
product_code = produkt
id = (auto increment)
key = nazwa
value = opis

Jak zrobić taką kopię najwydajniej z poziomu PHP? Warto dodać, że tabela posiada ponad 250.000 wpisów!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Najwydajniej chyba byłoby zrzucić dane do pliku CSV, po czym wczytać je do nowej tabeli poprzez LOAD DATA. Kwestia tylko czy pole opis nie będzie tutaj problemem... Tak czy siak LOAD DATA jest pierońsko szybkie więc stawiałbym na tą funkcję.

PS: jeśli bazy są na tym samym serwerze* możesz wykonać INSERT INTO FROM SELECT - będziesz miał mniej zachodu, a i czas wykonania może być szybszy. Generalnie na czas przerzutu danych usunąłbym indeksy (używasz MyISAM więc o wyłączenie sprawdzania więzów integralności nie ma się co martwić).

* widzę, że są więc spróbowałbym tej opcji

Ten post edytował phpion 8.09.2009, 20:33:41
Go to the top of the page
+Quote Post
nexis
post
Post #3





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

Ostrzeżenie: (0%)
-----


Cytat(phpion @ 8.09.2009, 21:27:50 ) *
PS: jeśli bazy są na tym samym serwerze* możesz wykonać INSERT INTO FROM SELECT - będziesz miał mniej zachodu, a i czas wykonania może być szybszy. Generalnie na czas przerzutu danych usunąłbym indeksy (używasz MyISAM więc o wyłączenie sprawdzania więzów integralności nie ma się co martwić).

* widzę, że są więc spróbowałbym tej opcji

Zapomniałem dodać, że każda baza ma innego użytkownika, więc ten sposób chyba odpada.

Operacja ma się wykonywać docelowo co 24 godziny, więc chciałbym aby załatwił to skrypt PHP, odpalany przez CRON.

Ten post edytował nexis 8.09.2009, 21:48:34
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(nexis @ 8.09.2009, 22:47:31 ) *
Zapomniałem dodać, że każda baza ma innego użytkownika, więc ten sposób chyba odpada.

Nie możesz stworzyć dodatkowego użytkownika mającego dostęp do obu baz?

Cytat(nexis @ 8.09.2009, 22:47:31 ) *
Operacja ma się wykonywać docelowo co 24 godziny, więc chciałbym aby załatwił to skrypt PHP, odpalany przez CRON.

No to tym lepiej zrobić to w samym SQL. Możesz odpalić w CRONie bezpośrednio samo zapytanie SQL (bez ingerencji w PHP) lub skorzystać z EVENTów w MySQL (wiem, że są/powinny być, ale nigdy sam z nich nie korzystałem).
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 7.10.2025 - 18:00