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%)
|
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 |
|
|
|
kezard Wydajność 22.06.2010, 16:44:57
Mchl A na jakim sprzęcie? 22.06.2010, 16:47:57
kezard Dobre pytanie. Na razie testuje tylko lokalnie na ... 22.06.2010, 16:53:40
Wicepsik Jedna tabela wystarczy. 22.06.2010, 17:20:20 
kezard Cytat(Wicepsik @ 22.06.2010, 18:20:20... 22.06.2010, 18:35:23
Mchl Może być taki, że mam tabele po kilkanaście milion... 22.06.2010, 18:59:01
misiek08 Operowałem na tabeli MySQL, która miała 200-300MB ... 22.06.2010, 19:12:37
maly_swd spokojnie w jednej tabeli. Jak baza Ci sie rozrosn... 24.06.2010, 07:26:12
wlamywacz W tabeli 20 milionów rekordów + joiny + warunki i ... 28.06.2010, 19:46:17 
kezard CytatW tabeli 20 milionów rekordów + joiny + warun... 30.06.2010, 10:44:51
mkozak Zdecydowanie w jednej tabeli.
Tylko musisz to ład... 29.06.2010, 09:22:18
wookieb Może zróbmy tak...
Podaj strukturę tabeli oraz zap... 29.06.2010, 09:27:11
mkozak Jak dedykowany to się nie masz czym martwić. Byle ... 30.06.2010, 14:02:29 
Mchl Cytat(mkozak @ 30.06.2010, 15:02:29 )... 30.06.2010, 23:13:48
wlamywacz U mnie wystarcza zwykły hosting u znajomego. Powta... 1.07.2010, 16:26:41 ![]() ![]() |
|
Aktualny czas: 27.12.2025 - 15:25 |