Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Wydajnośc baz danych
Demoneos
post
Post #1





Grupa: Zarejestrowani
Postów: 149
Pomógł: 0
Dołączył: 26.02.2008

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


Czy jeżeli tabela ma bardzo dużo wierszy, to jej podział na mniejsze tabele (np. po 100 000 wierszy każda) mógłby przyśpieszyć wykonywanie zapytać?
Np. tabela przechowująca dane osób mogłaby być podzielona "alfabetycznie" na tabele:
osoby_a, osoby_b, osoby_c, itd.
Gdzie tabela_a przechowuje dane osób, których imię zaczyna się od "A".
  1. swich ( PobierzePierwszaLitere($imie) )
  2. {
  3. case ("a")
  4. $nazwa_tabeli = "osoby_a";
  5. break();
  6. case ("b")
  7. $nazwa_tabeli = "osoby_b";
  8. break();
  9. itd....
  10. }

Czy wówczas np. takie zapytanie:
  1. selec * FROM $nazwa_tabeli WHERE $imie LIKE 'Adam';

wykonywałaoby się szybciej niż gdyb dane wszystki osób były przechowywane w jednej tabeli?
Go to the top of the page
+Quote Post
gorden
post
Post #2





Grupa: Zarejestrowani
Postów: 486
Pomógł: 101
Dołączył: 27.06.2010

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


ee wtedy więcej miejsca zajmujesz. nie wiem po co oddzielna tabela dla każdej pierwszej litery, skoro można zrobić tabelę imiona a w warunku dawać coś takiego:
LIKE '$pierwsza_litera%'
Go to the top of the page
+Quote Post
erix
post
Post #3





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
wykonywałaoby się szybciej niż gdyb dane wszystki osób były przechowywane w jednej tabeli?

Nie tyle, co miejsca, a pamięci. Spróbuj sortować/grupować wyniki z takiego czegoś.

Jedyne, co mi przychodzi do głowy, to partycjonowanie: http://dev.mysql.com/doc/refman/5.1/en/par...g-overview.html

Ale zaznaczam, jeszcze w temat się nie zagłębiałem, więc mogę siać herezje. (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
jaslanin
post
Post #4





Grupa: Zarejestrowani
Postów: 511
Pomógł: 143
Dołączył: 13.03.2010
Skąd: Jasło

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


To czego szukasz nazywa się partycjonowaniem bazy danych. I może przyśpieszyć wykonywanie zapytań, jednak zależy to od wielu czynników, info na ten temat można znaleźć na internecie.

Implementować to jednak należy raczej po stronie bazy danych poprzez przeznaczony do tego mechanizm partycjonowania. A nie poprzez jakiś mechanizm zrobiony przez siebie. Bo możesz mieć problemy gdy będziesz musiał wyciągać jakieś dane z wielu partycji. Np. w jakimś zbiorczym raporcie itp.

Odnośnie samych partycji to powinny one w jak najbardziej równomierny sposób rozkładać pomiędzy siebie obciążenie, zarówno dotyczące ilości wierszy jak i ilości zapytań do pojedynczej partycji. I podział na pierwszą literę imienia, wydaje mi się nieoptymalnym rozwiązaniem pod tym względem bo myślę, że niektóre imiona są w znaczący sposób bardziej popularne od innych. Ale oczywiście sens takiego partycjonowania zależy od szczegółów projektu i w Twoim przypadku być może ma to sens.
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #5





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Prosta sprawa, wystarczy zapłacić, powiedzmy 20 tyś euro, za konsulacje komuś kto zna się na bazach danych, a ten zrobi Ci to porządnie.
Niestety ale tak to wygląda, specjalistów w tej dziedzinie jest mało, sama tematyka jest bardzo, bardzo, bardzo, bardzo, bardzo, bardzo, bardzo trudna i złożona.

Administrowanie bazą czyli między innymi kwestia partycjonowania czyli fizycznego ułożenia danych na nośniku to jedno.
Druga sprawa to programowanie - konstrukcja zapytania i wiedza na temat jak optymalizator je zmodyfikuje.
Z optymalizatorami zapytań jest o tyle "wesoło", że są one najgłębiej skrywaną tajmenicą producenta.

Ja tutaj nawet nie rzuciłem najbladszego światła na temat.
Przeczytałem na ten temat pare książek, wiem z nich, że z bazami wcale nie jest tak hop-siup jakby się mogło komuś wydawać. Tak jak napisałem wyżej, temat jest niezmiernie skomplikowany.

Jeśli mam dawać jakieś rady, to mogę dać jedną... Zakładaj indeksy i módl się.

Pozdrowienia.

Ten post edytował wNogachSpisz 10.01.2012, 00:42:23
Go to the top of the page
+Quote Post
uupah5
post
Post #6





Grupa: Zarejestrowani
Postów: 207
Pomógł: 18
Dołączył: 4.09.2010
Skąd: warszawa

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


wNogachSpisz - nie siej paniki.

do autora pytania: jest kilka sposobów na osiągnięcie dobrej wydajności.
po pierwsze założenie indeksu na imię. różnych imion w Polsce jest 1-1,5k, różnorodność więc jakaś tam jest. istnieje szansa, że taki indeks załatwi Ci sprawę.
jeśli rekordów jest b. dużo (nie, 1mln rekordów to NIE jest dużo) to można rozbijać strukturę: wydzielić imiona do osobnej tabeli (będzie max 2k wierszy, w tym int autoincrement) a w tabeli głównej dać klucz obcy. taki index będzie szybszy.

kolejne mechanizmy możliwe do wykorzystania to wspomniane partycjonowanie. z tym, że dla małych zbiorów danych (mniej niż powiedzmy 100mln) raczej wzrost wydajności nie będzie większy niż dobre zaindeksowanie tabel. poza tym są pewne ograniczenia - więcej znajdziesz tutaj: http://www.slideshare.net/datacharmer/part...mysql-51-and-55
Go to the top of the page
+Quote Post
Demoneos
post
Post #7





Grupa: Zarejestrowani
Postów: 149
Pomógł: 0
Dołączył: 26.02.2008

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


Cytat(uupah5 @ 10.01.2012, 07:55:53 ) *
jeśli rekordów jest b. dużo (nie, 1mln rekordów to NIE jest dużo)


W takim razie ile to jest dużo rekordów? (IMG:style_emoticons/default/smile.gif)

Aż tak dużej ilości rekorodów w swojej bazie danych nie będę miał, więc będzie to pewnie dobrze chodzić nawet bez żadnych optymializacji, ale dobrze jest na przyszłość wiedzieć, że są takie rzeczy jak partycjoowanie i indeksy.

Ten post edytował Demoneos 10.01.2012, 11:29:59
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: 7.10.2025 - 15:34