Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Klucze obce - ktory typ indexu wybrac
lukaskolista
post
Post #1





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Witam. Mam problem ktory typ indexu wybrac dla kluczy obcych. Z tego co znalazlem w sieci BTREE jest najbardziej uniwersalny i najbardziej sie do tego nadaje, ale wole zapytac Was. Za wszystkie konstruktywne wypowiedzi dziekuje.
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




HASH używasz wtedy kiedy nie potrzebujesz sortowania a wyszukujesz jedynie konkretne wartości. BTREE jest po prostu bardziej uniwersalny.
Go to the top of the page
+Quote Post
lukaskolista
post
Post #3





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Potrzebuje jak najwieksza wydajnosci kluczy obcych poniewaz baza ma kilkanascie mln rekordow i z zalozenia bedzie miala duzo wiecej
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Ale indeksów nie zakłada się pod "schemat" tabeli tylko pod zapytania i częstotliwość ich występowań. Poza tym konieczne jest info o selektywności danych w kolumnie. Bez tego, żaden indeks nie pomoże.
Go to the top of the page
+Quote Post
lukaskolista
post
Post #5





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Dane sa pobierane bardzo czesto (300 osob na raz mieli system). Chodzi mi o szybkie zlaczenia bo to one sa najwolniejsze. Pola na ktore nakladam warunki tez oczywiscie musza miec indexy, ale to jest drugi krok w rozwiazaniu problemu wydajnosci. Chodzi mi o ogolne poradu w jakim przypadku jaki index bo z reszta sobie poradze.

Ten post edytował lukaskolista 9.06.2011, 12:22:19
Go to the top of the page
+Quote Post
wookieb
post
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Ale przecież mówię Ci jasno, że bez podanych przeze mnie wyżej danych, zakładanie indeksu to półbezsens.
Go to the top of the page
+Quote Post
lukaskolista
post
Post #7





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Users:
id
name
password

Users_Numbers
user_id
number_id

Numbers:
id
number

Properties
id
number_id
name
value

  1. SELECT * FROM users
  2. JOIN users_numbers ON users.id = users_numbers.user_id
  3. JOIN numbers ON users_numbers.number_id = numbers_id
  4. JOIN properties ON properties.number_id = numbers.id


Tak to wyglada. Po kluczach obcych w ogole nie wyszukuje, robie po nich jedynie zlaczenia.
Go to the top of the page
+Quote Post
phpion
post
Post #8





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Czy to całe zapytanie? Pewnie nie. Jeśli jednak tak, to przy założeniu, że masz kilkanaście milionów rekordów (jak piszesz) to nie dziwota, że działa powoli. Podaj całe zapytanie (wraz z warunkami).
Go to the top of the page
+Quote Post
lukaskolista
post
Post #9





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


  1. SELECT * FROM users
  2. JOIN users_numbers ON users.id = users_numbers.user_id
  3. JOIN numbers ON users_numbers.number_id = numbers_id
  4. JOIN properties ON properties.number_id = numbers.id
  5. WHERE users.id = 5837354
Wyknuje sie okolo 2 sec ale to stanowczo za wolno i wlasnie dlatego chce nalozyc indexy, tylko nie wiem ktory typ wybrac.
Go to the top of the page
+Quote Post
phpion
post
Post #10





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Nie sądzę, by typ indeksu wiele tutaj pomógł, ale możesz przecież samodzielnie spróbować: najpierw btree i sprawdzić czas, potem hash i sprawdzić czas.

Ja spróbowałbym rozbić to na kilka zapytań, bo coś mi się wydaje, że poprzez SELECT * pobierasz nadmiarową liczbę danych. Czyli najpierw pobierasz samego użytkownika, potem pobierasz jego numery. W tym co robisz to dla każdego zwracanego wiersza dodajesz również informacje o użytkowniku.
Go to the top of the page
+Quote Post
AsYlum
post
Post #11





Grupa: Nieautoryzowani
Postów: 8
Pomógł: 1
Dołączył: 18.07.2007

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


Indeksy typu hash wiele nie zmienią, a mogą Ci sprawić dodatkowe problemy.

Cytat
Note: Testing has shown PostgreSQL's hash indexes to perform no better than B-tree indexes, and the index size and build time for hash indexes is much worse. Furthermore, hash index operations are not presently WAL-logged, so hash indexes might need to be rebuilt with REINDEX after a database crash. For these reasons, hash index use is presently discouraged.
Go to the top of the page
+Quote Post
everth
post
Post #12





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


@phpion
Cytat
Ja spróbowałbym rozbić to na kilka zapytań, bo coś mi się wydaje, że poprzez SELECT * pobierasz nadmiarową liczbę danych. Czyli najpierw pobierasz samego użytkownika, potem pobierasz jego numery.

Nie sądzę żeby tak było, chyba że optymalizator zapytań MySQLa jest tak dupiaty że wykonuje złączenie przed operacją restrykcji. Rzuć EXPLAIN.
Go to the top of the page
+Quote Post
phpion
post
Post #13





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@everth:
Chodziło mi o nadmiarowość w już zwracanych danych, np.:
Kod
users.id | users.username | users.name | phones.id | phones.number
1        | mietek         | Mieczyslaw | 1         | 123 45 67 89
2        | heniek         | Henryk     | 2         | 234 56 78 90
2        | heniek         | Henryk     | 3         | 345 67 89 01
2        | heniek         | Henryk     | 4         | 456 78 90 12

Przy Henryku mamy 3x pobrane dane użytkownika - o tą nadmiarowość mi chodziło.

PS: Nie MySQL, a PostgreSQL (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
everth
post
Post #14





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


Tu już trzeba by mieć wiedzę jak realizowane jest to przez sterownik bazy. W PDO jest metoda fetchColumn która pozwala wybrać z wiersza interesujące nas kolumny. Jeśli te zapytania są traktowane przez bazę jako adhoc to w rezultacie twoje podejście może okazać się bardziej ciężkostrawne dla bazy niż jedno duże zapytanie.

PS: Tak to już jest jak się pisze w środku nocy.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 12:43