Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> MySQL - dodanie seryjne rekordów
arpi
post 21.07.2019, 22:08:22
Post #1





Grupa: Zarejestrowani
Postów: 39
Pomógł: 0
Dołączył: 7.01.2011

Ostrzeżenie: (10%)
X----


Witam
Do tej pory wszytskie zapytania do bazy wykonuje z poziomu PHP, jendak przy dużych ilościach danych zauważam problemy z wydajnością.
Chciałbym część zapytań wykonywać bezpośrednio na bazie MySQL.

Czy może ktoś wie jak zrobić poniższe zapytanie (pętle) bez zastosowania php ?

  1.  
  2. $i = 0;
  3.  
  4. for($i; $i<31262; $i++){
  5. $insert = mysql_query("INSERT INTO nazwa_tabeli (id_product, priority) values ($i, 'taki sam ciąg znaków')");
  6. echo $i.'<br>';
  7. }
  8.  


z góry wielkie dzięki
Go to the top of the page
+Quote Post
viking
post 22.07.2019, 06:33:05
Post #2





Grupa: Zarejestrowani
Postów: 5 279
Pomógł: 889
Dołączył: 30.08.2006

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


Najpierw generuj listę values potem podstaw do zapytania. Rozszerzenie mysql_ zostało dawno temu usunięte z php.


--------------------
Go to the top of the page
+Quote Post
arpi
post 23.07.2019, 09:32:35
Post #3





Grupa: Zarejestrowani
Postów: 39
Pomógł: 0
Dołączył: 7.01.2011

Ostrzeżenie: (10%)
X----


Jeśli ma ktoś gotowy kod SQL będę zobowiązany.
Go to the top of the page
+Quote Post
sazian
post 23.07.2019, 20:24:18
Post #4





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

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


Domyślam się że viking miał na myśli coś w wym stylu
  1. $values=[];
  2. for($i=0; $i<31262; $i++){
  3. $values[]="($i, 'taki sam ciąg znaków')";
  4.  
  5. }
  6. $insert = mysql_query("INSERT INTO nazwa_tabeli (id_product, priority) values ".implode(',',$values));

chociaż przy takich ilościach rekordów i tak może to być wolne.
Ewentualnie można by się pokusić o napisanie jakiejś procedury sql która będzie "robiła pętle", istnieje szansa że będzie to trochę szybsze niż wysyłanie tak dużego zapytania
https://dev.mysql.com/doc/refman/5.7/en/while.html

Ten post edytował sazian 23.07.2019, 20:25:06
Go to the top of the page
+Quote Post
kreatiff
post 23.07.2019, 21:52:07
Post #5





Grupa: Zarejestrowani
Postów: 274
Pomógł: 87
Dołączył: 7.08.2012

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


A spróbuj to zrobić tak. Nadal to jedno po drugim, ale w jednej transakcji i PDO:
  1. $pdo = new PDO('mysql:host=localhost;dbname=nazwa_bazy;charset=utf8', 'user', 'hasło');
  2. $pdo->beginTransaction();
  3. $q = $pdo->prepare("INSERT INTO nazwa_tabeli (id_product, priority) values (:id_product, :priority)");
  4. for ($i = 0; $i < 31262; $i++) {
  5. $q->bindValue(':id_product', $i, PDO::PARAM_INT);
  6. $q->bindValue(':priority', 'taki sam ciąg znaków', PDO::PARAM_STR);
  7. $q->execute();
  8. }
  9. $pdo->commit();


A jak ma być najszybsze (czyli jedno zapytanie z 30k+ INSERTami na raz <nie mam pojęcia, czy tyle można, w SSLite jest zdaje się limit jakiś, 500?>), to tak jak wyżej, albo jeśli 'taki sam ciąg znaków' jest wszędzie ten sam, to najpierw pododawaj same id_produkt, a dopiero później zrób update priority dla całego przedziału.

Ten post edytował kreatiff 23.07.2019, 21:52:45
Go to the top of the page
+Quote Post
arpi
post 25.07.2019, 10:13:38
Post #6





Grupa: Zarejestrowani
Postów: 39
Pomógł: 0
Dołączył: 7.01.2011

Ostrzeżenie: (10%)
X----


Dziękuje za odpowiedzi, wasze rozwiązania za pomocą PHP są rzeczywiście troszkę szybsze od mojego (przykład podałem taki prosty aby był łatwy do analizy).
Jednak nie ukrywam że pytałem jak to zrobić bez PHP, czyli za pomoca samego SQL. wiem że są procedury w MySQL ale nie miałem z tym nigdy styczności, a podejrzewam ze za ich pomocą taki skrypt wykona się kilkadziesiąt razy szybciej.

Przykład: kopiowanie tabel za pomoca SQL trwa kilka sekund, z poziomu PHP import/export około minuty.
Go to the top of the page
+Quote Post
nospor
post 25.07.2019, 10:16:44
Post #7





Grupa: Moderatorzy
Postów: 34 688
Pomógł: 5770
Dołączył: 27.12.2004




Czyzby chodzilo ci o to
https://dev.mysql.com/doc/refman/8.0/en/load-data.html
?


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

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"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
sazian
post 25.07.2019, 18:02:08
Post #8





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

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


@kreatiff tylko po co pdo skoro @arpi korzysta z mysql - należały by przejść na mysqli
https://www.php.net/manual/en/mysqli.prepare.php
https://www.php.net/manual/en/mysqli.begin-transaction.php
https://www.php.net/manual/en/mysqli.commit.php
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: 23.08.2019 - 10:40