konto usunięte

Temat: [mysql indeksy - kiedy, ile ... ?

mam pytanie odnośnie zakładania indeksów na kolumny.
Załóżmy że mam tabele z użytkownikami, większość z tych pól ma powtarzające się wartości np województwa, wykształcenie. Na jednej ze stron przeczytałem że nie warto zakładać indeksów na polach z tymi samymi wartościami np. mężczyzna, kobieta. Moje pytanie to: gdzie jest granica, kiedy warto a kiedy nie, kiedy indeks poprawi wydajność a kiedy nie? Czy na kolumnę z województwami warto zakładać indeks? Czy jeśli wartości będzie mniej np 7 to też warto czy nie? Proszę o jakieś wskazówki.
Krzysztof P.

Krzysztof P. Programista, Team
Leader

Temat: [mysql indeksy - kiedy, ile ... ?

(dlaczego znów mi się wydaje, że temat nie na tą grupę ;])

konto usunięte

Temat: [mysql indeksy - kiedy, ile ... ?

jezeli baza danych bedzie sortowac po tej kolumnie - zaloz indeks.

no i oczywiscie NTG :)

konto usunięte

Temat: [mysql indeksy - kiedy, ile ... ?

wszystko zalezy od potrzeb aplikacji i potrzeb kierowanych do bazy.

jeśli masz 1000000 rekordów i wyszukujesz jedynie 4-5 pozycji po numerze ID, czy wieku osoby - indeks spowolni tylko odczyt z bazy. Jeżeli natomiast z 1000000 rekordów potrzebujesz wybrać wszystkich Januszów z Krakowa, to 2 indeksy na imię i miasto będą dobre.
Ale jeśli założysz indeks na imię, miasto, województwo i wiek, to możesz być pewien, że stracisz kolosalnie na wydajności ;-)

polecam lekturę Stéphane Faroult - Sztuka programowania SQL http://www.oreillynet.com/pub/e/1032Kuba Świegot edytował(a) ten post dnia 19.07.08 o godzinie 10:43

konto usunięte

Temat: [mysql indeksy - kiedy, ile ... ?

Wojciech Zbigniew Piotrowicz:
no i oczywiscie NTG :)
zapomniałem że jest grupa "bazy danych" :P

Kuba Świegot:
jeśli masz 1000000 rekordów i wyszukujesz jedynie 4-5 pozycji po numerze ID, czy wieku osoby - indeks spowolni tylko odczyt z bazy. Jeżeli natomiast z 1000000 rekordów potrzebujesz wybrać wszystkich Januszów z Krakowa, to 2 indeksy na imię i miasto będą dobre.
zakładam że tabela na początek będzie mieć 30000, ilość będzie się zwiększać, i na stronę będę wyświetlał 30 - 50 pozycji - sortowanie wg dużej ilości opcji/kolumn np, 20 pól [z wartościami powtarzającymi się] + 5 pól zależnych od użytkownika (treść, tagi) - chyba jedyne co mnie ratuje to jakaś lektura i testy :P
Piotr Lewandowski

Piotr Lewandowski Programista
aplikacji
internetowych (PHP,
MySQL, SF2, Mag...

Temat: [mysql indeksy - kiedy, ile ... ?

Paweł Ryznar:
zakładam że tabela na początek będzie mieć 30000, ilość będzie się zwiększać, i na stronę będę wyświetlał 30 - 50 pozycji - sortowanie wg dużej ilości opcji/kolumn np, 20 pól [z wartościami powtarzającymi się] + 5 pól zależnych od użytkownika (treść, tagi) - chyba jedyne co mnie ratuje to jakaś lektura i testy :P

Chyba tak :) Zakladajac indeksy na kolumny tekstowe nie trzeba ich zakladac na cala dlugosc rekordu, ale tez zbyt "krotki" index zwieksza ilosc powtorzen w indexie, co sie przekalda na spadek wydajnosci. Nie jestem ekspertem od baz danych, ale wydaje mi sie ze w takim wypadku jedynie testy pomoga, bo podane zaleznosci zaleza od konkretnych danych trzymanych w bazie.
Jakub L.

Jakub L. Programista

Temat: [mysql indeksy - kiedy, ile ... ?

Akurat tutaj to ja bym jednak znormalizował bazę - województw jest naście, liczba powiatów też nie jest powalająca, a indeksy na liczbach całkowiych są lepsze od tych na łańcuchach.

Temat: [mysql indeksy - kiedy, ile ... ?

jeśli masz 1000000 rekordów i wyszukujesz jedynie 4-5 pozycji po numerze ID, czy wieku osoby - indeks spowolni tylko odczyt z bazy.

eee?

Czyli jak z wielkiej tabeli chcesz dostać jeden wiersz to wolisz robić fullscana niż zrobić jeden/dwa skoki w B+ drzewie?
Właśnie jak z wielkiej tabeli chce się wyciągać małą ilość wierszy to wtedy należy zdecydowanie użyć indeksu. Jak z wielkiej tabeli chcesz wyciągnąć 95% wierszy to bardziej się opłaca zrobić fullscan niż ileś razy przeszukiwać drzewo.
Jeżeli natomiast z 1000000 rekordów potrzebujesz wybrać wszystkich Januszów z Krakowa, to 2 indeksy na imię i miasto będą dobre.

Kolejna rzecz, której nie rozumiem.
W takim wypadku dwa indeksy Ci nie pomogą bo zostanie wykorzystany tylko jeden z nich. W tej sytuacji bardzo by pomógł jeden indeks dwukolumnowy imie-miasto.
Ale jeśli założysz indeks na imię, miasto, województwo i wiek, to możesz być pewien, że stracisz kolosalnie na wydajności ;-)

Też się nie zgadzam.
Taki indeks mógłby bardzo pomóc w sytuacji kiedy chcielibyśmy znaleźć wszystkich Januszów z Krakowa i wyświetlić ich województwo (co akurat tutaj byłoby trochę bez sensu) oraz wiek. Wtedy takie zapytanie byłoby index-only co jest piekielnie szybkie. Natomiast taki indeks kupę pamięci zajmuje.

konto usunięte

Temat: [mysql indeksy - kiedy, ile ... ?

Jakub L.:
Akurat tutaj to ja bym jednak znormalizował bazę - województw jest naście, liczba powiatów też nie jest powalająca, a indeksy na liczbach całkowiych są lepsze od tych na łańcuchach.
co do tego to robię tak, województwa mam zapisane w tabeli z użytkownikami jako liczby [tinyint] i w kodzie php wypisuje wartość tablicy dla pobranej wartości z bazy, nie jest to całkiem znormalizowane, no ale wydaje mi się że lepiej w kodzie php sprawdzać niż zrobić 3 tabele i później łączyć je żeby wyciągać użytkowników z województwami - jeśli źle myślę proszę o komentarz

Temat: [mysql indeksy - kiedy, ile ... ?

php sprawdzać niż zrobić 3 tabele i później łączyć je żeby wyciągać użytkowników z województwami - jeśli źle myślę proszę o komentarz

Ja bym zrobił osobne tabele i laczyl.

konto usunięte

Temat: [mysql indeksy - kiedy, ile ... ?

tylko jeszcze jedno, jeśli połączę tą, to pasowałoby i następne tak zrobić i tak wyjdzie że zamiast pobrać dane z jednej tabeli i przetworzyć je w php [zmienić liczbę z bazy na tekst] to będę miał masę złączeń: bo dojdzie 20 tabel pośredniczących id_użytkownik-id_elementu i 20 tabel id-id_elementu
Piotr Lewandowski

Piotr Lewandowski Programista
aplikacji
internetowych (PHP,
MySQL, SF2, Mag...

Temat: [mysql indeksy - kiedy, ile ... ?

Kolejny raz nie jestem pewien, ale jednak zabiore glos. Wydaje mi sie, ze jesli tabele wojewodz, powiatow nie beda duze to nie wplynie to znaczaco na wydajnosc, a uproszczenie przyszlych zapytan moznaby osiagnac stosujac widok. Czy moze sie myle? :)
Krzysztof P.

Krzysztof P. Programista, Team
Leader

Temat: [mysql indeksy - kiedy, ile ... ?

Paweł Ryznar:
tylko jeszcze jedno, jeśli połączę tą, to pasowałoby i następne tak zrobić i tak wyjdzie że zamiast pobrać dane z jednej tabeli i przetworzyć je w php [zmienić liczbę z bazy na tekst] to będę miał masę złączeń: bo dojdzie 20 tabel pośredniczących id_użytkownik-id_elementu i 20 tabel id-id_elementu

Gdzie w województwach masz jakieś pośredniczące?
Do tego złączenie na poziomie bazy będzie szybsze, niż to co zrobisz w PHP. Do tego cześć danych w kodzie aplikacji, część w bazie, jest trochę (skromnie mówiąc) dziwne.
Tylko trzeba pamiętać, że takie złączenia które tylko są potrzebne do wyświetlenia muszą być zrobione na samym końcu, aby nie rzutowało to na wydajność.

Takie umieszczenie informacji w bazie bardzo uczytelnia kod który z tego korzysta.

Temat: [mysql indeksy - kiedy, ile ... ?

tylko jeszcze jedno, jeśli połączę tą, to pasowałoby i następne tak zrobić i tak wyjdzie że zamiast pobrać dane z jednej tabeli i przetworzyć je w php [zmienić liczbę z bazy na tekst] to będę miał masę złączeń: bo dojdzie 20 tabel pośredniczących

Może to Ci da obraz skali.
W moim systemie zarządzania treścią mam 80 tabel. Wiele zapytań ma po około 5-6 złączeń. Śmiga aż miło. Wszystko kwestią dobrych indeksów. Poza tym uwierz, że 30 000 rekordów to dla bazy żaden problem.
Robiłem kiedyś skrypt dla wortalu (jeszcze w liceum kiedy moje pojęcie o bazach było niewielkie). W bazie nie ma ani jednego indeksu, sama struktura też nie jest najciekawsza. Jednym słowem zero optymalizacji. W bazie jest dużo więcej rekordów niż 30 000, Codziennie strona ma około 9 tys. odsłon i nie ma żadnych problemów z wydajnością. Jest postawiona na współdzielonym hostingu. Dzisiaj się za ten program wstydzę ale pokazuje on, że naprawdę trudno jest zabić serwer. Mimo wszystko niektórym się to udaje. Nie wiem jak.
Alan Gabriel B.

Alan Gabriel B. Software Engineer,
IFX

Temat: [mysql indeksy - kiedy, ile ... ?

Paweł Ryznar:
[...]

Zacznijmy od tego, że takie dane jak województwa i powiaty (a dalej nawet gminy), czyli generalnie dane TERYTowe powinieneś trzymać w jednej tabeli w postaci drzewa - bo to są z definicji struktury drzewiaste. I coś mi się obiło o uszy że SELECTY z tabeli z JOINami po niej samej są szybkie.

konto usunięte

Temat: [mysql indeksy - kiedy, ile ... ?

Michał S.:
Gdzie w województwach masz jakieś pośredniczące?
fakt :P pomyliło mi się ;) że będzie wiele do wielu ;)
Michał S.:
Do tego złączenie na poziomie bazy będzie szybsze, niż to co zrobisz w PHP.
hmm, korzystam z ORM'a, a dla złączenia kilkunastu tabel to tworzenie obiektów jednak trochę potrwa
Michał S.:
Do tego cześć danych w kodzie aplikacji, część w bazie, jest trochę (skromnie mówiąc) dziwne.
hmm, powiedziałbym to zależy, bo wprowadzenie modyfikacji np. jakby się województwa zmienił wymaga ingerencji w kodzie, ale z drugiej strony trochę upraszcza sprawę np. przy rejestracji, walidacji formularzy
zresztą decyzja powinna zależeć od rodzaju danych. No bo jeśli chodzi o województwa to jest to logiczne, to w wypadku danych jak płeć itp to raczej nie
Michał S.:
Tylko trzeba pamiętać, że takie złączenia które tylko są potrzebne do wyświetlenia muszą być zrobione na samym końcu, aby nie rzutowało to na wydajność.
nie bardzo rozumiem ...Paweł Ryznar edytował(a) ten post dnia 19.07.08 o godzinie 20:40
Krzysztof P.

Krzysztof P. Programista, Team
Leader

Temat: [mysql indeksy - kiedy, ile ... ?

Paweł Ryznar:
Michał S.:
Do tego złączenie na poziomie bazy będzie szybsze, niż to co zrobisz w PHP.
hmm, korzystam z ORM'a, a dla złączenia kilkunastu tabel to tworzenie obiektów jednak trochę potrwa

Ale i tak zrobi to jedną kwerendą, a tworzenie obiektów wcale nie jest takie kosztowne, sprawdź co ile zajmuje a się przekonasz.
to w wypadku danych jak płeć itp to raczej nie

To już zależy od konwencji, szczerze, to bym musiał to przemyśleć, bo jak na razie tylko korzystałem z czyichś rozwiązań, ale nie wiem czy też nie było by chociaż tak głupiego dwu rekordowego słownika.
Michał S.:
Tylko trzeba pamiętać, że takie złączenia które tylko są potrzebne do wyświetlenia muszą być zrobione na samym końcu, aby nie rzutowało to na wydajność.
nie bardzo rozumiem ...

Chodzi o to, aby budować tak kwerendy, aby dołączanie danych potrzebnych tylko do wyświetlenia odbywało się na końcu, aby baza nie przetwarzała tych danych kiedy są zbędne.
Alan Gabriel B.

Alan Gabriel B. Software Engineer,
IFX

Temat: [mysql indeksy - kiedy, ile ... ?

Michał S.:
Chodzi o to, aby budować tak kwerendy, aby dołączanie danych potrzebnych tylko do wyświetlenia odbywało się na końcu, aby baza nie przetwarzała tych danych kiedy są zbędne.

Mógłbyś wyjaśnić dokładniej? Zazwyczaj wiem, czego potrzebuję w danym widoku i wiem jakie musi być zapytanie.
Mógłbyś jakiś przykład podać?

Pozdrawiam.

konto usunięte

Temat: [mysql indeksy - kiedy, ile ... ?

ok :) dzięki za wskazówki, jednak przerobię to na bazę
Waldemar Jonik

Waldemar Jonik właściciel,
webmaster,
programista, JW Web
Development

Temat: [mysql indeksy - kiedy, ile ... ?

Do tego złączenie na poziomie bazy będzie szybsze, niż to co zrobisz w PHP. Do tego cześć danych w kodzie aplikacji, część w bazie, jest trochę (skromnie mówiąc) dziwne.
Tylko trzeba pamiętać, że takie złączenia które tylko są potrzebne do wyświetlenia muszą być zrobione na samym końcu, aby nie rzutowało to na wydajność.

Takie umieszczenie informacji w bazie bardzo uczytelnia kod który z tego korzysta.

ja wole stale tabele danych np wojewodztwa trzymac w php, miasta to juz cos innego bo czesciej to sie zmienia. przy malo obciazonych systemach to nie robi roznicy ale np robiac serwis spolecznosciowy gdzie ilosc danych i ilosc zapytan jest bardzo duza (wystarczy tylko kilka GB danych w bazie), kazde zmniejszenie ilosci odwolan do bazy jest warte uzglednienia.

ktos wspomnial o widokach, juz na kilku forach walcze z mitem ze na mysql widoki daja cos wiecej poza uproszczeniem zapytan. sa bazy danych gdzie widoki moga pomoc przyspieszyc obliczenia ale nie w w mysql. trzeba ich uzywac z umiarem bo w php widok moze tylko spowolnic zapytanie a laczenie w zapytaniu danych z kilku widokow to juz zupelnie tragedia bo wtedy mysql nie uzywa indeksow.

Następna dyskusja:

Problem z kodowaniem MySQL




Wyślij zaproszenie do