![]() |
![]() |
![]()
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:
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 -------------------- |
|
|
![]() |
![]()
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 |
|
|
![]()
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
-------------------- |
|
|
![]()
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. -------------------- |
|
|
![]()
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.
-------------------- |
|
|
![]()
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.
-------------------- |
|
|
![]()
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:
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 -------------------- |
|
|
![]()
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')));
-------------------- |
|
|
![]()
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...) -------------------- |
|
|
![]()
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 !
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 -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 08:13 |