Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MYSQL] Usuwanie zduplikowanych wpisów w tabeli
--Majestiq--
post 17.05.2008, 14:33:55
Post #1





Goście







Mam tabele o nazwie TAB i strukturze:

id int (11)
tytul varchar(50)
dlugosc varchar(200)
link varchar(200)
data date
czas varchar(200)
rozmiar varchar(200)
licznik int(10)

Pytanie - jakim poleceniem mogę usunąć wszystkie wiersze (poza 1) o tym samym tytule z tej tabeli ?
Szukałem ale rozwiązania były bardziej skomplikowane niż by się mogło wydawać i nie udało mi się do tej pory uzyskać zamierzonego efektu :/

Czy to ze większość pól jest varchar(200) ma wpływ na szybkość zapytań SELECT ?

Mam serwer na nazwa.pl i co chwila blokuje mi bazę z powodu przekroczenia czasu zapytań na godzinę czy jakoś tak (limit 600s na godzinę)
a tak naprawdę wszystkie zapytania to selecty na tej jednej tabeli i dziwie się że tak szybko limit wykorzystuje - co by było o zgrozo gdybym miał wiele tabel i na nich wykonywał operacje, chyba w ogóle od razu by mi baza padła.

W bazie (tabela tab) jest około 100 000 rekordów, ale przecież to nie dużo jak na bazę danych.

Proszę o pomoc.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
pacior
post 17.05.2008, 14:43:03
Post #2





Grupa: Zarejestrowani
Postów: 101
Pomógł: 2
Dołączył: 25.09.2007

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


  1. SELECT DISTINCT tytul FROM TAB
Go to the top of the page
+Quote Post
Cysiaczek
post 17.05.2008, 14:44:22
Post #3





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Ja mam to samo niestety przy jednym sklepie (skończy się chyba na VPS). Tu nie wielkość tabeli ma znaczenie, a to, jak dużo danych pobierasz jednokrotnie. Może to nie jest potrzebne? Limit jest na czas operacji na bazie danych, więc taki zabieg pomoże. Chyba, że masz dużo odwołań, wtedy nic nie zrobisz. Niestety, nazwa.pl pod tym względem sobie kpi z klientów - pewnie liczą na to, że klient zapłaci z dedykowaną bazę danych i kupi ich VPS ;/

Co do usuwania:
Wyciągnij rekord i rekord o nazwie takiej samej jak ten pierwszy (w podzapytaniu: tabelebis.tytul=tabela.tytul). Jeśli wynik da 2 i więcej rekordów, skasuj je w następnym zapytaniu (już przecież masz ich ID).

Pozdrawiam.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
Crozin
post 17.05.2008, 15:58:06
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


A odpowiednie indexy na tabele pozakładane masz? winksmiley.jpg
Go to the top of the page
+Quote Post
Cysiaczek
post 17.05.2008, 16:24:48
Post #5





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Indeksy tu nie pomogą, choć trochę przyspieszają. To jest wina nazwa.pl i ich limitu. Nie chce tu rozpoczynać dyskusji o nazwa.pl, ale teraz jest 600 sekund (10 minut), a niedawno było 900 sekund (15 minut). Wystarczy średni sklep z rozbudowaną administracją i nazwa.pl wymięka. Policzcie sobie np. 0.06 sekundy na jedną odsłonę i macie:
10000 odsłon = 600 sekund

Dla części publicznej styknie, ale teraz policzcie sobie synchro z jakąś hurtownią, operacje na produktach, kwarendy. Tu zapytania czasem są liczone w sekundach.

Pozdrawiam.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
-Gość-
post 17.05.2008, 16:40:48
Post #6





Goście







Cytat(Cysiaczek @ 17.05.2008, 14:44:22 ) *
Ja mam to samo niestety przy jednym sklepie (skończy się chyba na VPS). Tu nie wielkość tabeli ma znaczenie, a to, jak dużo danych pobierasz jednokrotnie. Może to nie jest potrzebne? Limit jest na czas operacji na bazie danych, więc taki zabieg pomoże.


Tzn. jaki :-)
To usunięcie duplikatów ?

Cytat
Co do usuwania:
Wyciągnij rekord i rekord o nazwie takiej samej jak ten pierwszy (w podzapytaniu: tabelebis.tytul=tabela.tytul). Jeśli wynik da 2 i więcej rekordów, skasuj je w następnym zapytaniu (już przecież masz ich ID).


A mógłbyś mi napisać cały kod dla tej tabeli.
Niestety jestem początkującym SQLowcem i mam duże problemy z troszkę bardziej skomplikowanymi rzeczami :|


A to SELECT DISTINCT tytul from TAB tak jak kolega na początku radził nie pomoże questionmark.gif

Co do mojej bazy to czasem jednocześnie kilkadziesiąt osób ja odpytuje (select) no i rozumiem z tego co mówicie, że nazwa.pl nie nadaje się zupełnie dla mnie ?!

No i sprawa tych indeksów o których mówicie?
Mogą one 'coś' pomóc (jak mówię w sumie tylko 1 tabela jest wykorzystywana przy większości zapytań) ?
Ciężko je założyć ?

No i ostatnia sprawa - jakby komuś chciało się luknąć na tego posta:
http://forum.php.pl/PHPMYSQLProblem_z_wysz...rka_t94012.html

Może mam tam w którymś miejscu coś strasznie niezoptymalizowanego i można by to kilkukrotnie przyśpieszyć.
Szczególnie jeśli chodzi o plik szukarka.php

Najczęściej jest chyba wykonywane zapytanie:

  1. $sql = 'SELECT id,tytul,rozmiar,licznik FROM `'.$tabelka.'` WHERE `tytul` LIKE '%'.$wykonawca.'%' ORDER by tytul ';
  2. $result123 = mysql_query($sql);
  3. $rekordow = mysql_num_rows($result123);


Może można tu coś zmienić questionmark.gif
Go to the top of the page
+Quote Post
-Gość-
post 18.05.2008, 05:45:45
Post #7





Goście







Odpowie mi ktoś na to: http://forum.php.pl/index.php?showtopic=94...st=#entry472306 questionmark.gif
Go to the top of the page
+Quote Post
--Majestic--
post 18.05.2008, 09:21:49
Post #8





Goście







Czy ma sens sprawdzanie jak długo wykonuje się SELECT za pomocą:

  1. <?php
  2. $czas1=microtime(); 
  3. $sql = 'SELECT * FROM ...';
  4. $czas2=microtime(); 
  5. $czas=$czas2-$czas1; 
  6. echo $czas;
  7. ?>


Bo jakiś mam dziwny rozrzut w wynikach dla tych samych zapytań ...
Go to the top of the page
+Quote Post
Crozin
post 18.05.2008, 10:01:06
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Jeżeli chcesz znać czas w jakim wykonywało się zapytanie SQL - to tak, ma to sens.
Go to the top of the page
+Quote Post
--Majestiq--
post 18.05.2008, 10:25:25
Post #10





Goście







A czy można to (czas wykonywania) sprawdzić jakoś bezpośrednio po stronie serwera ?

Prosiłbym jeszcze o odpowiedź na posta nr 3 :-)
Go to the top of the page
+Quote Post
.radex
post 18.05.2008, 10:27:09
Post #11





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

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


W sensie jak bezpośrednio po stronie serwera? Sposób obliczenia czasu wykonania sam podałeś.


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
--Majestiq--
post 18.05.2008, 11:08:26
Post #12





Goście







Sorki, masz rację - miałem na myśli nie w php tylko jakimś poleceniem SQLowym bo ten sposób, który podałem
zwraca mi bardzo różne czasy dla tych samych zapytań.

Czy jeśli SELECT zwraca mi powiedzmy 100 rekordów a ja dam LIMIT 20 to czy rzeczywiście zapytanie będzie o 4/5 szybsze questionmark.gif
Go to the top of the page
+Quote Post
--Majestiq--
post 18.05.2008, 11:13:54
Post #13





Goście







Jeszcze jedna sprawa co do sposobu obliczania czasy zapytań podanego przeze mnie.

Select wykonywał się około 0.3 sekundy i zwrócił kilka tysięcy rekordów, jednak na ekranie wynik pojawił mi się po dopiero ładnych kilku sekundach.
'Wydrukowanie' tych danych na ekran albo przetworzenie zwróconego wyniku w php trwało aż tak długo czy o co chodzi questionmark.gif
Go to the top of the page
+Quote Post
.radex
post 18.05.2008, 12:53:57
Post #14





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

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


Nie rozumiem, dlaczego chcesz w to angażować bazę danych? Baza danych ma być od przechowywania danych, a SQL ma być sposobem ich przetwarzania. Takimi detalami powinien zająć się język skryptowy (w tym przypadku PHP). Po za tym chyba nie jest możliwe zrobienie tego poprzez zapytanie.


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
-Gość-
post 18.05.2008, 13:14:47
Post #15





Goście







Nie chce znać czasu wykonywania z poziomu skryptu ...
Jest chyba jakieś polecenie cośw stylu BENCHMARK ... chyba w PHPmyAdmin można wpisać
Go to the top of the page
+Quote Post
majestiq
post 20.05.2008, 07:32:06
Post #16





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

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


Muszę odświerzyć temat:

Mam tabele o nazwie TAB i strukturze:
id int (11)
tytul varchar(50)
dlugosc varchar(200)
link varchar(200)
data date
czas varchar(200)
rozmiar varchar(200)
licznik int(10)

i chciałbym usunąć wszystkie (poza jednym - ostatnim bądź pierwszym) rekordy, które mają identyczne tytuły.
Tutaj ktoś podawał sposób, ale coś mi to nie wychodzi.

Mógłby ktoś napisać takie zapytanie dla tej konkretnie tabeli ?

Z góry wielkie dzięki!


--------------------
Free mp3 download.
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 - 05:06