![]() |
![]() ![]() |
![]() |
![]()
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".
Czy wówczas np. takie zapytanie:
wykonywałaoby się szybciej niż gdyb dane wszystki osób były przechowywane w jednej tabeli? |
|
|
![]()
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%' |
|
|
![]()
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) |
|
|
![]()
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. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 233 Pomógł: 87 Dołączył: 6.03.2009 Ostrzeżenie: (40%) ![]() ![]() |
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 |
|
|
![]()
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 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 149 Pomógł: 0 Dołączył: 26.02.2008 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 7.10.2025 - 15:34 |