Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Jak przyśpieszyć update
borpaw
post 13.07.2013, 10:23:35
Post #1





Grupa: Zarejestrowani
Postów: 439
Pomógł: 0
Dołączył: 3.06.2010

Ostrzeżenie: (50%)
XXX--


Mam tabele która ma kilka milionów rekordów, wykonanie na niej najprostsze UPDATE zajmóje około 20 sek

Sama tabela ma około 30 kolumn, to też ma wpływ na czas wykonania.

Czy można coś zrobić żeby było szybciej? Czy może najlepiej rozbić tabele na mniejsze w sensie liczby kolumn?

Ten post edytował borpaw 13.07.2013, 10:24:12
Go to the top of the page
+Quote Post
gothye
post 13.07.2013, 10:30:04
Post #2





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

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


może na początku pokaż strukturę tabeli i zapytanie jakim wykonujesz update


--------------------
Nie udzielam pomocy poprzez PW
Go to the top of the page
+Quote Post
borpaw
post 13.07.2013, 10:41:05
Post #3





Grupa: Zarejestrowani
Postów: 439
Pomógł: 0
Dołączył: 3.06.2010

Ostrzeżenie: (50%)
XXX--


Proszę bardzo, tabela:

  1. CREATE TABLE `data` (
  2. `id` int(100) NOT NULL AUTO_INCREMENT,
  3. `pole_1` varchar(100) NOT NULL,
  4. `pole_2` varchar(100) NOT NULL,
  5. `pole_3` varchar(100) NOT NULL,
  6. `pole_4` varchar(100) NOT NULL,
  7. `pole_5` varchar(100) NOT NULL,
  8. `pole_6` varchar(100) NOT NULL,
  9. `pole_7` varchar(100) NOT NULL,
  10. `pole_8` int(11) NOT NULL,
  11. `pole_9` int(11) NOT NULL,
  12. `pole_10` int(11) NOT NULL,
  13. `pole_11` int(11) NOT NULL,
  14. `pole_12` varchar(100) NOT NULL,
  15. `pole_13` varchar(100) NOT NULL,
  16. `pole_14` varchar(100) NOT NULL,
  17. `pole_15` int(11) NOT NULL,
  18. `pole_16` int(11) NOT NULL,
  19. `pole_17` int(11) NOT NULL,
  20. `pole_18` varchar(100) NOT NULL,
  21. `pole_19` varchar(100) NOT NULL,
  22. `pole_20` varchar(100) NOT NULL,
  23. `pole_21` int(11) NOT NULL,
  24. `pole_22` int(11) NOT NULL,
  25. PRIMARY KEY (`id`)
  26. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;


  1. UPDATE DATA SET pole_1='test'
Go to the top of the page
+Quote Post
rocktech.pl
post 13.07.2013, 11:21:28
Post #4





Grupa: Zarejestrowani
Postów: 587
Pomógł: 131
Dołączył: 8.02.2010

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


Witam.

  1. ALTER TABLE `data` ENGINE=INNODB;


--------------------
Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. --Brian Moore

I never go looking for a sucker. I look for a Champion and make a sucker of of him. --Amarillo Slim


Home-made : js-gui-classes | Accordion | Tabs | Carousel / php-sms-classes | Obsługa bramki SMS MultiInfo | Obsługa bramki SMS Mobiltek
Go to the top of the page
+Quote Post
borpaw
post 13.07.2013, 13:06:32
Post #5





Grupa: Zarejestrowani
Postów: 439
Pomógł: 0
Dołączył: 3.06.2010

Ostrzeżenie: (50%)
XXX--


Zmieniłem na InnoDB i jest znacznie gorzej.

Chyba nic poza rozbiciem na mniejsze tabele nie pozostaje, co myślicie?
Go to the top of the page
+Quote Post
sazian
post 13.07.2013, 19:30:10
Post #6





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


no niestety ale aktualizacja kilku milionów rekordów musi trochę trwać
Go to the top of the page
+Quote Post
bpskiba
post 14.07.2013, 08:39:09
Post #7





Grupa: Zarejestrowani
Postów: 340
Pomógł: 49
Dołączył: 3.07.2009
Skąd: Rzeszów

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


Zapytam o serwer.
Myślę, że chodzi na słabej maszynie lub na domyślnej konfiguracji. Kilka milionów rekordów to dużo, ale czas rzędu 20s to przesada. Odpalałeś skrypty do optymalzacji??
Go to the top of the page
+Quote Post
borpaw
post 14.07.2013, 08:54:16
Post #8





Grupa: Zarejestrowani
Postów: 439
Pomógł: 0
Dołączył: 3.06.2010

Ostrzeżenie: (50%)
XXX--


nie odpalałem a co dokładnie trzeba zrobić?
Go to the top of the page
+Quote Post
bpskiba
post 14.07.2013, 10:37:25
Post #9





Grupa: Zarejestrowani
Postów: 340
Pomógł: 49
Dołączył: 3.07.2009
Skąd: Rzeszów

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


Mysql wymaga ręcznej konfiguracji wielkości buforów pamięci w pliku konfiguracyjnym.
Domyślna konfiguracja jest wystarczająca dla małych baz danych i słabych maszyn. Wykorzystuje ona jednak małą część dostępnej pamięci RAM komputera. Dla operacji na dużych bazach to nie wystarcza, więc silnik MySQL wczytuje dane "na raty" i tworzy bufor na dysku. Skutkuje to kotastrofalnym spadkiem wydajności.
Zrozumienie funkcji poszczagólnych buforów nie jest łatwe, ale istnieją skrypty podpowiadające co zrobić. Poniżej jeden z nich

http://www.techerator.com/2011/08/optimize...l-tuner-script/

Ten post edytował bpskiba 14.07.2013, 11:52:40
Go to the top of the page
+Quote Post
rocktech.pl
post 14.07.2013, 12:11:14
Post #10





Grupa: Zarejestrowani
Postów: 587
Pomógł: 131
Dołączył: 8.02.2010

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


Wykonujesz UPDATE zapewne z klauzulą WHERE? Tabela ma tylko jeden indeks id. Sprawdź czy przy zapytaniu jest wykorzystywany.
Jeśli wykonujesz UPDATE na milionach rekordów to będzie to trwało dłuuugo.

Zerknij jeszcze na PROCEDURE ANALYSE

  1. SELECT * FROM `data` PROCEDURE ANALYSE(10000, 2000);


Ten post edytował rocktech.pl 14.07.2013, 12:11:40


--------------------
Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. --Brian Moore

I never go looking for a sucker. I look for a Champion and make a sucker of of him. --Amarillo Slim


Home-made : js-gui-classes | Accordion | Tabs | Carousel / php-sms-classes | Obsługa bramki SMS MultiInfo | Obsługa bramki SMS Mobiltek
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 03:31