Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL] Jak to przyspieszyć?
busterek
post 22.05.2017, 20:53:59
Post #1





Grupa: Zarejestrowani
Postów: 107
Pomógł: 0
Dołączył: 30.07.2006
Skąd: Łódź

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


Mam taki prosty skrypt:

  1. <?php
  2.  
  3. $con = mysql_connect('localhost', 'user', 'haslo');
  4. mysql_select_db('mailing');
  5.  
  6.  
  7. $file = file('/srv/www/newmailing/log2');
  8.  
  9. foreach ($file as $line)
  10. {
  11. $data = explode(' -> ', $line);
  12. $mail = $data[1];
  13. $query = 'update emails set sent = "1" where sent = "0" and email = "'.$mail.'";';
  14. mysql_query($query);
  15. }
  16. ?>


W zaczytywanym pliku jest ponad 330.000 linii. Czy da się to jakoś przyśpieszyćquestionmark.gif Bo działa to sakramencko wolno. wink.gif
Go to the top of the page
+Quote Post
nospor
post 22.05.2017, 21:00:34
Post #2





Grupa: Moderatorzy
Postów: 36 442
Pomógł: 6290
Dołączył: 27.12.2004




1) Mozesz wywalic z warunku
sent = "0"

2) zalozyc index na pole email

3) Oraz by nie wykonywac 330k zapytan do bazy, podzielic to na paczki, np po 1000 i bedzie tylko 330 zapytan smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
busterek
post 22.05.2017, 21:04:44
Post #3





Grupa: Zarejestrowani
Postów: 107
Pomógł: 0
Dołączył: 30.07.2006
Skąd: Łódź

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


Najbardziej mnie interesuje ten punkt 3.

Myślałem o tym, ale nie za bardzo wiem jak to ugryźć. Weź podpowiedz jakoś. Jak jednym zapytaniem zmienić 1000 rekordów?

Ten post edytował busterek 22.05.2017, 21:05:21
Go to the top of the page
+Quote Post
Pyton_000
post 22.05.2017, 21:05:17
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Po pierwsze wywal te mysql_* i zamień choćby na mysqli lub PDO.

Może tak będzie szybciej:

Kod
CREATE TEMPORARY TABLE temptable (
  email VARCHAR,
  INDEX (email)
) ENGINE = MEMORY;

LOAD DATA LOCAL INFILE '/srv/www/newmailing/log2' INTO temptable (column2) FIELDS TERMINATED BY ' -> ';

UPDATE emails JOIN temptable USING(email) SET sent = "1" WHERE sent = "0" AND emails.email = temptable.email;

DROP TEMPORARY TABLE temptable;
Go to the top of the page
+Quote Post
Spawnm
post 22.05.2017, 21:05:40
Post #5





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Sprawdz where email in ($maile)

//edit
Pyton dal chyba najciekawsze rozwiazanie
Powód edycji: [Spawnm]:
Go to the top of the page
+Quote Post
busterek
post 23.05.2017, 08:38:34
Post #6





Grupa: Zarejestrowani
Postów: 107
Pomógł: 0
Dołączył: 30.07.2006
Skąd: Łódź

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


Właśnie próbuję wykonać kod pokazany przez Pytona. Ale nie wiem co jest. Tabelę dodaje. Ładowanie pliku musiałem przerobić na taką linijkę, bo ta która jest w przykładzie zgłasza błąd w składni.

  1. LOAD DATA LOCAL INFILE '/srv/www/newmailing/log2' INTO TABLE temptable FIELDS TERMINATED BY ' -> ';


Ale po wykonaniu otrzymuję błąd: ERROR 2013 (HY000): Lost connection to MySQL server during query

Co jest nie tak?
Go to the top of the page
+Quote Post
Pyton_000
post 23.05.2017, 08:48:42
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


to co wywaliłeś było potrzebne aby do tabeli załadować tylko kolumnę z mejlami. Inaczej musisz stworzyć temptable z 2 kolumnami. Co do składni i błędu bardzo możliwe, nie testowałem tego, tak tylko na szybko.

Gdzie odpalasz te zapytania?
Go to the top of the page
+Quote Post
busterek
post 23.05.2017, 08:56:46
Post #8





Grupa: Zarejestrowani
Postów: 107
Pomógł: 0
Dołączył: 30.07.2006
Skąd: Łódź

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


Zapytania odpalam bezpośrednio w konsoli mysql-a.
Go to the top of the page
+Quote Post
Pyton_000
post 23.05.2017, 09:00:44
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Po zalogowaniu do Mysql odpal jeszcze:

Kod
SET wait-timeout=3600;
SET max-allowed-packet=419430400;

i ponownie spróbuj
Go to the top of the page
+Quote Post
busterek
post 23.05.2017, 09:13:55
Post #10





Grupa: Zarejestrowani
Postów: 107
Pomógł: 0
Dołączył: 30.07.2006
Skąd: Łódź

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


Ruszyło. Natomiast teraz problem z UPDATE. Zapytanie się wykonuje, ale nic nie zmienia.
Go to the top of the page
+Quote Post
Pyton_000
post 23.05.2017, 09:22:14
Post #11





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Sprawdź czy zawartość w temptable jest odpowiednia np:

Kod
SELECT CONCAT('"', emails, '"') FROM temptable;

bo możliwe że są tam jakieś białe znaki które nie łączą się w pary z mejlami z mejls.
Go to the top of the page
+Quote Post
busterek
post 23.05.2017, 09:27:20
Post #12





Grupa: Zarejestrowani
Postów: 107
Pomógł: 0
Dołączył: 30.07.2006
Skąd: Łódź

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


No tak. W pliku nie ma białych znaków. Ale w głównej tabeli już są. Ehhhh. To już wiem co zrobić.

---Albo i nie wiem. wink.gif

Ten post edytował busterek 23.05.2017, 09:30:58
Go to the top of the page
+Quote Post
Pyton_000
post 23.05.2017, 10:03:41
Post #13





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


TRIM(emails.email) = TRIM(temptable.email)
Go to the top of the page
+Quote Post
busterek
post 23.05.2017, 12:55:39
Post #14





Grupa: Zarejestrowani
Postów: 107
Pomógł: 0
Dołączył: 30.07.2006
Skąd: Łódź

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


No tak. Wykonuję takie zapytanie. W zasadzie składnia jest poprawna i powinno działać. Ale nie działa.

  1. UPDATE emails JOIN temptable USING(email) SET sent = "1" WHERE trim(BOTH "\n" FROM emails.email) = temptable.email;


Zapytanie się wykonuje, ale nic nie zmienia. Czy może coś źle jest?

A sprawdziłem jak wygląda kolumna email w tabeli emails po wykonaniu tego TRIM-a. I jest ok, bez białych znaków. W temptable też nie ma białych znaków.

Udało się. Trochę na około, bo miałem błędy w danych. Ale udało się. Dzięki za pomoc.

Ten post edytował busterek 23.05.2017, 10:12:30
Go to the top of the page
+Quote Post
Pyton_000
post 23.05.2017, 12:58:12
Post #15





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Pochwal się wynikiem. Jaki czas?
Go to the top of the page
+Quote Post
busterek
post 23.05.2017, 14:46:50
Post #16





Grupa: Zarejestrowani
Postów: 107
Pomógł: 0
Dołączył: 30.07.2006
Skąd: Łódź

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


Kurcze. Nie spojrzałem, ale chyba coś koło 45 sekund. Błyskawica. wink.gif
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: 18.04.2024 - 08:07