Rastman
30.01.2005, 12:14:38
Mam taki pytanko odnośnie bazki w Mysql. Na razie wszystko działa ok, ale mam jedna tabelkę(12 pól), która dość szybko się zapełnia nowymi rekordami. Przewiduję, że za kilka miesięcy może być kilkaset tysięcy rekordów, może milion. Czy taka liczba rekordów wpłynmie znacząco na szybkość przeszukiwaniaq bazki? Bo mam pomysł, żeby podzielić ją na kilka bliźniaczych, ale nie wiem czy jest sens. moze ktoś zna odpowiedź
sobstel
30.01.2005, 13:06:05
z dobrze założonymi indeksami nie powinno być tak źle, ale oczywiście czym mniej rekordów w bazie tym lepiej (czyt. szybciej). jesli częśc danych ulega "przedawnieniu", tzn. np stare zamówienia czy coś w tym rodzaju, czy też po prostu dane z których coraz rzadziej korzystamy najlepiej wywalić do innej tabeli...
Rastman
2.02.2005, 00:51:40
właśnie problem w tym, że wszystkie rekordy w tej tabeli będą aktualne, będą podlegać conajwyżej modyfikacji. zastanawiam się czy możnaby stworzyć kilka tabel bliźniaczych, podzielić ej odpowiednio na kategorie, nie wiem tylko czy to eleganckie, no i trochę mniej funkcjonalne
popbart
2.02.2005, 08:50:21
Aby być przygotowanym na ewentualne kłopoty,
najlepiej stwórz sobie kopie tej bazy i zapełnij ją do ok 2 milionów.
Następnie wykonaj testy a dowiesz się czy masz dobre index'y
sobstel
2.02.2005, 09:24:12
Cytat(Rastman @ 2005-02-02 00:51:40)
właśnie problem w tym, że wszystkie rekordy w tej tabeli będą aktualne, będą podlegać conajwyżej modyfikacji. zastanawiam się czy możnaby stworzyć kilka tabel bliźniaczych, podzielić ej odpowiednio na kategorie, nie wiem tylko czy to eleganckie, no i trochę mniej funkcjonalne
1. założenie indeksów to podstawa. jesli dane są ułożone według konkretnej kolumny np.daty możesz co jakis czas wykonywać ALTER TABLE table ORDER BY kolumna DESC
2. stworzenie bliznaczych tabel dla różnych kategori, jesli tylko nie przeszkodzi to w formułowaniu zapytań, a wpłynie na wydajność jest jak najbardziej dobrym rozwiązaniem. w końcu właścicielowi systemu przeważnie nie chodzi o to czy rozwiązanie będzie eleganckie, ale czy skuteczne i wydajne z punktu widzenia użytkownika.
popbart
2.02.2005, 09:45:52
Cytat
ALTER TABLE table ORDER BY kolumna DESC
Co to znaczy?
Cytat
2. stworzenie bliznaczych tabel dla różnych kategori, jesli tylko nie przeszkodzi to w formułowaniu zapytań, a wpłynie na wydajność jest jak najbardziej dobrym rozwiązaniem. w końcu właścicielowi systemu przeważnie nie chodzi o to czy rozwiązanie będzie eleganckie, ale czy skuteczne i wydajne z punktu widzenia użytkownika.
No nie wiem.
Jeżeli będzie chciał wyszukiwać dane we wszystkich tabelach,
to używanie UNION dla kilku tabel będzie małą katastrofą.
sobstel
2.02.2005, 10:01:49
Cytat(popbart @ 2005-02-02 09:45:52)
Cytat
ALTER TABLE table ORDER BY kolumna DESC
Co to znaczy?
Cytat
2. stworzenie bliznaczych tabel dla różnych kategori, jesli tylko nie przeszkodzi to w formułowaniu zapytań, a wpłynie na wydajność jest jak najbardziej dobrym rozwiązaniem. w końcu właścicielowi systemu przeważnie nie chodzi o to czy rozwiązanie będzie eleganckie, ale czy skuteczne i wydajne z punktu widzenia użytkownika.
No nie wiem.
Jeżeli będzie chciał wyszukiwać dane we wszystkich tabelach,
to używanie UNION dla kilku tabel będzie małą katastrofą.
1. porzadkuje rekordy w bazie wedlug kolumny
kolumna2. jak napisalem : "jesli to nie przeszkodzi w formułowaniu zapytań"
popbart
2.02.2005, 13:28:40
Cytat
1. porzadkuje rekordy w bazie wedlug kolumny kolumna
Wiem, chodziło mi jaki ma to związek z wydajnością.
Cytat
2. jak napisalem : "jesli to nie przeszkodzi w formułowaniu zapytań"
Tu nie chodzi o formułowanie zapytań. Chcąc cokolwiek wyszukać, musisz zrobić coś w rodzaju:
SELECT *
FROM (SELECT *
FROM tabela1 UNION ALL SELECT *
FROM tabela2 UNION ALL SELECT *
FROM tabela3 ....itd) AS temp WHERE pole='costam'
Jak wiesz podzapytanie from buduje tabelę tymczasową,
więc moim zdaniem lepiej trzymać wszystko w jednej tabeli z dobrze założonymi index'ami.
Rastman
17.02.2005, 23:10:18
no i tu pojawia się problem, ponieważ wykonanie zapytania dla 700 000 rekordó trwa kilka minut lokalnie, w przypadku zwróconych kilku, kilkunastu rekordów kilkadziesiąt sekund, ale z bliźniaczymi tabrlami to też niedobry pomysł. Ale przeciez istnieją duże serwisy oparte o mysql'a, więc jakies optymalne rozwiązanie musi istnieć
pozdrawiam
FiDO
18.02.2005, 02:14:36
To moze napisz cos wiecej o danych, ktore przechowujesz.
Podaj strukture tabeli i zapytanie(a), ktore tak muli(ą).
Rastman
18.02.2005, 19:07:48
są to dane firm, ale mój problem chyba został rozwiązany przez zastosowanie indeksów. To chyba optymalne rozwiązanie. pozdrawiam
sobstel
19.02.2005, 01:14:08
Cytat(popbart @ 2005-02-02 13:28:40)
Cytat
1. porzadkuje rekordy w bazie wedlug kolumny kolumna
Wiem, chodziło mi jaki ma to związek z wydajnością.
cytując manuala
This option is mainly useful when you know that you are mostly going to query the rows in a certain order; by using this option after big changes to the table, you might be able to get higher performance. innymi słowy, mysql szybciej wyszuka rekordy z tabeli jesli sa uporzadkowane tak jak w zapytaniu.
NuLL
19.02.2005, 01:39:26
Sorki za [OT]W Sieci można znaleść artykuły opisujące przypadki kiedy MysQL działał z 5 miliardami(

!) rekordów tabeli(!) -- pogoogluj troche

[/OT]
Bakus
20.02.2005, 08:19:29
Z mojego doświadczenia wynika, że dobrze opracowane tabele zawierające bardzo duże ilości danych znacznie lepiej działają niż źle opracowane tabele z małą ilością rekordów...
Warto wykonać na tabeli polecenie:
SELECT *
FROM `tabela` PROCEDURE ANALYSE ( )
by zobaczyć jak silnik MySQLa ułożył dane w takiej tabeli (w phpMyAdmin jest to funkcja "Propozycja struktury tabeli" dostępna pod listą pól tabeli).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.