[PHP][MYSQL] Jak to przyspieszyć? |
[PHP][MYSQL] Jak to przyspieszyć? |
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:
W zaczytywanym pliku jest ponad 330.000 linii. Czy da się to jakoś przyśpieszyć Bo działa to sakramencko wolno. |
|
|
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 -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
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 |
|
|
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; |
|
|
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]:
|
|
|
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.
Ale po wykonaniu otrzymuję błąd: ERROR 2013 (HY000): Lost connection to MySQL server during query Co jest nie tak? |
|
|
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? |
|
|
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.
|
|
|
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 |
|
|
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.
|
|
|
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. |
|
|
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. Ten post edytował busterek 23.05.2017, 09:30:58 |
|
|
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)
|
|
|
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.
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 |
|
|
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?
|
|
|
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.
|
|
|
Wersja Lo-Fi | Aktualny czas: 18.04.2024 - 08:07 |