Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP] Usuwanie zduplikowanych wpisow
Agape
post 25.08.2016, 14:53:29
Post #1





Grupa: Zarejestrowani
Postów: 384
Pomógł: 13
Dołączył: 16.06.2006

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


Mam w tabeli produkty z ich nazwami, do wgrywanych produktow robie dodatkowa kolumne `nazwa_unikalna` gdzie zapisuje tytul obciety do max 50 znakow. Nastepnie mam cos takiego w uproszczeniu:
  1. $produkty_unikalne = array();
  2. foreach ($produkty as $produkty_){
  3. if(in_array($produkty_['nazwa_unikalna'], $produkty_unikalne)){
  4. //jezeli produkt o takiej nazwie juz wystepowal, usuwaj powielony
  5. }else{
  6. //zbieraj unikalne do porownania
  7. $produkty_unikalne[] = $produkty_['nazwa_unikalna'];
  8. }
  9. }

czyli jezeli napotka drugi i kolejny produkt ktory ma taka sama nazwe unikalna, to usuwa go zeby nie bylo takich samych poduktow w bazie. Problem w tym ze baza ma pareset tysiecy rekordow i funkcja ta wykonuje sie pare minut, czym wiecej produktow przerobi tym bardziej zwalnia. Potrzebuje ja zastapic poleceniem sql, zeby zostawialo pierwszy produkt z taka nazwa a usuwalo nastepne, niestety nie mam pojecia jak to zrobic :/

7 minut dokladnie wykonuje sie to zapytanie, jakbym zszedl do 2 byloby idealnie ...

Ten post edytował Agape 25.08.2016, 15:02:39


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
kapslokk
post 25.08.2016, 14:57:01
Post #2





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


http://stackoverflow.com/questions/3311903...e-rows-in-mysql

Ten post edytował kapslokk 25.08.2016, 14:57:48
Go to the top of the page
+Quote Post
Agape
post 25.08.2016, 15:00:26
Post #3





Grupa: Zarejestrowani
Postów: 384
Pomógł: 13
Dołączył: 16.06.2006

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


nie moge dac unique index na ta kolumne bo przestanie mi to dzialac tak jak potrzebuje i jak reszta rzeczy jest skonstrulowana, wlasnie chodzi o to ze musze to zrobic zapytaniem, tak baza jest skonstrulowana


--------------------
Go to the top of the page
+Quote Post
trueblue
post 25.08.2016, 15:10:25
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


7 minut wykonuje się zapytanie czy ten kod?
Ten kod nie powinien tyle się wykonywać. Zresztą zapytanie (nie wiem jak wygląda) również nie.

Zainteresuj się wyzwalaczem before insert.


--------------------
Go to the top of the page
+Quote Post
Agape
post 25.08.2016, 15:18:59
Post #5





Grupa: Zarejestrowani
Postów: 384
Pomógł: 13
Dołączył: 16.06.2006

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


ten kod, baza ma 130 MB i zawiera 130 000 rekordow wiec pewnie dla tego, kazdy produkt sie pobiera pojedynczo i usuwa pojedynczo (jezeli jest zduplikowany) wiec to troche zapytan jest.


--------------------
Go to the top of the page
+Quote Post
trueblue
post 25.08.2016, 15:26:03
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


No, to już jakieś rozwiązanie masz - usuwać jednym zapytaniem. Zebrać id i wykonać jeden delete.


--------------------
Go to the top of the page
+Quote Post
Agape
post 25.08.2016, 15:34:23
Post #7





Grupa: Zarejestrowani
Postów: 384
Pomógł: 13
Dołączył: 16.06.2006

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


Wlasnie nie chodzi o to ze dlugo sie usuwa, tylko dlugo mieli. Pobieram cala baze (ale tylko id, nazwe i nazwa_unikalna) jednym zapytaniem i czas ktory napisalem jest dla bazy w ktorej nie ma duplikatow, samo sprawdzanie calej bazy tyle zajmuje, mielenie tablicy, nie wiem czy in_array tak dlugo zajmuje czy co ... wiec w php jest jakis problem :/

mysle ze czym wiecej ma wartosci w tablicy, tym dluzej musi je porownywac i dla tego tym tym bardziej zwalnia z czasem wykonywania :/

zrobilem kolumne `id` auto increment i zapytanie:
  1. DELETE b1 FROM `baza` b1, `baza` b2 WHERE b1.nazwa_unikalna = b2.nazwa_unikalna AND b1.id > b2.id;

i po 11 min zabilem proces, w phpmyadmin nawet sie nie dalo wejsc :/
moze dodac index do tej kolumny ? moze cos innego niz in_array ? mecze sie z tym dlugi czas i nie moge dojsc jak to przyspieszyc :/



Ten post edytował Agape 25.08.2016, 15:36:05


--------------------
Go to the top of the page
+Quote Post
trueblue
post 25.08.2016, 15:44:40
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


$produkty_unikalne=array_unique(array_column($produkty,'nazwa_unikalna')));



--------------------
Go to the top of the page
+Quote Post
viking
post 25.08.2016, 15:44:55
Post #9





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


A to dlaczego nie kasujesz ich od razu na bazie tylko mielisz w PHP?
DELETE .... WHERE ... (SELECT...)


--------------------
Go to the top of the page
+Quote Post
Agape
post 25.08.2016, 15:51:44
Post #10





Grupa: Zarejestrowani
Postów: 384
Pomógł: 13
Dołączył: 16.06.2006

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


Panowie bardzo dziekuje wam za zainteresowanie tematem, znalazlem problem. Powyzszy skrypt wykonywal sie 7 min (ten na samej gorze). Zmienilem z in_array ktore jest bardzo wolne na isset ktore jest mega szybkie, ponizszy skrypt ktory robi to samo, a tylko jedna funkcja zostala zmieniona wykonuje sie w 1 sekunde !

  1. $produkty_unikalne = array();
  2. foreach ($produkty as $produkty_){
  3. if(isset($produkty_unikalne[$produkty_['nazwa_unikalna']])){
  4. //jezeli produkt o takiej nazwie juz wystepowal, usuwaj powielony
  5. }else{
  6. //zbieraj unikalne do porownania
  7. $produkty_unikalne[ $produkty_['nazwa_unikalna'] ] = 'x';
  8. }
  9. }


chodzi na pewno o to ze in_array przeszukuje cala tablice (ponad 100 tys rekordow) a isset probuje odczytac pojedyncza wartosc, jesli jest git, jesli nie to juz nie szuka w tysiacach rekordow tylko zwraca ze nie ma. Nie wiedzialem ze jest az taka roznica


--------------------
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 - 08:13