Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 19.01.2010 Ostrzeżenie: (0%)
|
Witam wszystkich!
Zwracam się z pytaniem do bardziej zaawansowanych użytkowników którzy wiedzą co nieco jak sprawuje się MySQL w sytuacjach dużej ilości danych. Pisze system wiadomości prywatnych i mam dylemat : trzymać wiadomości w jednej tabeli czy też podzielić tabele ze względu na foldery i w razie czego przenosić rekordy miedzy tabelami? Założyłem sobie następujące dane : 5000 kont użytkowników x (średnio) 20 wiadomości = 100k rekordów. Czy przy takiej ilości danych wydajne będzie trzymanie wszystkiego w jednej tabeli? Proszę o odpowiedzi. Pozdrawiam. |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%)
|
A na jakim sprzęcie?
|
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 19.01.2010 Ostrzeżenie: (0%)
|
Dobre pytanie. Na razie testuje tylko lokalnie na kompie. Może jesteś w stanie doradzić jaki serwer jest do tego potrzebny ? Może wiesz gdzie znaleźć jakieś testy żeby porównać wydajność tabel i czas oczekiwania przy roznych iloscach danych i konfiguracjach sprzetowych oraz jaki soft pozwala zrobic takie testy samemu?
|
|
|
|
Post
#4
|
|
|
Grupa: Zarejestrowani Postów: 1 575 Pomógł: 299 Dołączył: 26.03.2009 Ostrzeżenie: (20%)
|
Jedna tabela wystarczy.
|
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 19.01.2010 Ostrzeżenie: (0%)
|
|
|
|
|
Post
#6
|
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%)
|
Może być taki, że mam tabele po kilkanaście milionów wierszy i nie ma problemów z wydajnością?
|
|
|
|
Post
#7
|
|
|
Grupa: Zarejestrowani Postów: 91 Pomógł: 6 Dołączył: 2.02.2008 Ostrzeżenie: (10%)
|
Operowałem na tabeli MySQL, która miała 200-300MB i zaczynało się robić tragicznie. Potem przeszła ona w ~5,4GB i zapytanie z 2 warunkami WHERE, ORDER'EM i 1 JOIN'em trwało ok. 44sek. Lepiej podziel to jakoś między tabele. Może po prostu jakoś po id. Cokolwiek, jeśli spodziewasz się tylu rekordów, będzie wydajniejsze.
|
|
|
|
Post
#8
|
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%)
|
Stary, gdzie 100000 wierszy, a gdzie 5GB? No chyba że będą tam sobie wiadomości po 500000 znaków pisać.
A jak chcesz dzielić to przez partycjonowanie, a nie rozrzucać po niewiadomo ilu tabelach. [dodane] Pozwoliłem sobie zrobić taki test: Kod DROP TABLE IF EXISTS `test`.`wiadomosci`; CREATE TABLE `test`.`wiadomosci` ( `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, `fromID` int(10) unsigned NOT NULL, `toID` int(10) unsigned NOT NULL, `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `status` enum('UNREAD','READ') NOT NULL, `message` text NOT NULL, PRIMARY KEY (`ID`), KEY `index_2` (`fromID`,`toID`,`ts`,`status`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO wiadomosci VALUES (null,ROUND(RAND() * 2048),ROUND(RAND() * 2048),FROM_UNIXTIME(RAND() * POW(2,32) - 1), 'UNREAD', ''); INSERT INTO wiadomosci (fromID, toID, ts, status, message) SELECT ROUND(RAND() * 2048),ROUND(RAND() * 2048),FROM_UNIXTIME(RAND() * POW(2,32) - 1), 'UNREAD', '' FROM wiadomosci; -- powtorzone kilkanascie razy, az w tabali znalazlo sie ~1 300 000 wierszy UPDATE wiadomosci SET message = 'tutaj wstawiłem 2048 znaków'; -- uwaga, to trochę trwa :D SHOW TABLE STATUS LIKE 'wiadomosci'; > Avg_row_length: 2343 > Data_length: 2457862144 > Index_length: 39403520 > Data_free: 3521118208 > Auto_increment: 1376221 SELECT SQL_NO_CACHE * FROM wiadomosci WHERE fromID = 1 AND toID = 585; -- najpierw sprawdzilem czy taki istnieje;) > 1 row in set (0.00 sec) SELECT SQL_NO_CACHE * FROM wiadomosci WHERE fromID = 1 AND ts BETWEEN 20000101 AND 20100101; > 44 rows in set (0.01 sec) Raczej nie tak źle? W zależności od konkretnych zapytań trzebaby jeszcze założyć dodatkowe indeksy. Np do zapytania Kod SELECT SQL_NO_CACHE * FROM wiadomosci WHERE toID = 585; przydałby się indeks zaczynający się od kolumny toID. Ten post edytował Mchl 22.06.2010, 21:08:05 |
|
|
|
Post
#9
|
|
|
Grupa: Zarejestrowani Postów: 744 Pomógł: 118 Dołączył: 14.02.2009 Skąd: poziome Ostrzeżenie: (0%)
|
spokojnie w jednej tabeli. Jak baza Ci sie rozrosnie to http://dev.mysql.com/doc/refman/5.1/en/partitioning.html i wtedy bedzie smigalo
|
|
|
|
Post
#10
|
|
|
Grupa: Zarejestrowani Postów: 535 Pomógł: 27 Dołączył: 3.05.2005 Ostrzeżenie: (20%)
|
W tabeli 20 milionów rekordów + joiny + warunki i tylko 0.2 sekundy. Zależy od struktury tabeli i operacjach na niej.
|
|
|
|
Post
#11
|
|
|
Grupa: Zarejestrowani Postów: 78 Pomógł: 4 Dołączył: 21.03.2005 Ostrzeżenie: (0%)
|
Zdecydowanie w jednej tabeli.
Tylko musisz to ładnie zaindexować (po userze, po folderze + to co będzie ci potrzebne do wyszukiwania np. data). Jeżeli zrobisz w kilku tabelach i zaczną ci userzy przenosić maile pomiędzy tabelkami to będziesz miał bardzo nieprzyjemny efekt spadku wydajności wszystkich tabel (dużo operacji insert delete). Musiał byś bardzo często przeprowadzać maintenance na tebelach. |
|
|
|
Post
#12
|
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk |
Może zróbmy tak...
Podaj strukturę tabeli oraz zapytania jakie na niej wykonujesz a my pomożemy dobrać odpowiednią strukturę i indeksy ok? Ewentualnie zmienić niektóre zapytania. 100k dla bazy to nie jest dużo. Ten post edytował wookieb 29.06.2010, 09:27:22 |
|
|
|
Post
#13
|
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 19.01.2010 Ostrzeżenie: (0%)
|
Cytat W tabeli 20 milionów rekordów + joiny + warunki i tylko 0.2 sekundy. Zależy od struktury tabeli i operacjach na niej. Na jakim sprzęcie ? Bo planuje wynająć dedyka a nie brałem nigdy wcześniej, możne coś doradzisz? Cytat Tylko musisz to ładnie zaindexować (po userze, po folderze + to co będzie ci potrzebne do wyszukiwania np. data). Rozumiem ze wystarczy dodać w tabeli dodatkowe indexy i poustawiać ich moc w kolejności która mi odpowiada tak? Ogólnie to dziękuje wszystkim za podpowiedzi. Bardzo pomocne (IMG:style_emoticons/default/winksmiley.jpg) Ten post edytował kezard 30.06.2010, 10:59:18 |
|
|
|
Post
#14
|
|
|
Grupa: Zarejestrowani Postów: 78 Pomógł: 4 Dołączył: 21.03.2005 Ostrzeżenie: (0%)
|
Jak dedykowany to się nie masz czym martwić. Byle nie jakieś wirtualne G.
Weź sobie dyski 15k i zapas ramu. |
|
|
|
Post
#15
|
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%)
|
|
|
|
|
Post
#16
|
|
|
Grupa: Zarejestrowani Postów: 535 Pomógł: 27 Dołączył: 3.05.2005 Ostrzeżenie: (20%)
|
U mnie wystarcza zwykły hosting u znajomego. Powtarzam wszystko zależy od struktury tabeli i danych w niej.
|
|
|
|
![]() ![]() |
|
Aktualny czas: 26.12.2025 - 15:04 |