![]() |
![]() ![]() |
![]() |
![]()
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.
|
|
|
![]()
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.
|
|
|
![]()
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
|
|
|
![]()
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.
|
|
|
![]()
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 |
|
|
![]()
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.
|
|
|
![]()
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
Tak to wyglada. Po kluczach obcych w ogole nie wyszukuje, robie po nich jedynie zlaczenia. |
|
|
![]()
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).
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 872 Pomógł: 94 Dołączył: 31.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Wyknuje sie okolo 2 sec ale to stanowczo za wolno i wlasnie dlatego chce nalozyc indexy, tylko nie wiem ktory typ wybrac. |
|
|
![]()
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. |
|
|
![]()
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.
|
|
|
![]()
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. |
|
|
![]()
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) |
|
|
![]()
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 12:43 |