Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]partycjonowanie tabelki
wpaski
post 31.08.2016, 18:23:09
Post #1





Grupa: Zarejestrowani
Postów: 206
Pomógł: 6
Dołączył: 25.12.2011

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


Chciałem zgłębić ten temat, mianowicie partycjonowanie tabelki w MySQL.
Powiedzmy, że mam w bazie danych kilka milionów rekordów, ale interesują mnie tylko te z np. miesiąca, reszta danych (powiedzmy 70%) mnie nie interesuje i są w bazie tylko po to, żeby było archiwum.

Czy da się w jakiś sposób to wydzielić, że podczas przeszukiwania zapytaniem SELECT wyszukuje tylko z tej części tabeli która faktycznie zawiera te dane?
Teraz mam to w ten sposób, że jest warunek WHERE date coś na wzór:

Kod
SELECT * from tabela where true AND date > '2016-07-31;


No ale zapytanie trwa bardzo długo bo mieli całą bazę, co muszę po kolei wykonać, żeby zapytanie brało pod uwagę od razu tylko te najnowsze rekordy? Czyli jakby na jednej partycji były najnowsze dane a na tej drugiej stare. Jak to ugryźć?smile.gif

Jeśli nie partycjonowanie to czy jest inny sposób?
Jedyne co mi przychodzi to stworzenie dwóch tabel gdzie w jednej są dane aktualne a w drugiej wszystkie ale to bez sensu i tu w tym moim przypadku musi to być jednak w jednej tabeli.

Ten post edytował wpaski 31.08.2016, 18:26:38
Go to the top of the page
+Quote Post
nospor
post 31.08.2016, 19:07:48
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




nie
SELECT * from tabela where true AND date > '2016-07-31;

a
SELECT * from tabela where `date` > '2016-07-31';

Po drugie: zalozyles w ogole index na pole date?
No i zakladam ze pole date jest typu DATE


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
wpaski
post 1.09.2016, 13:41:15
Post #3





Grupa: Zarejestrowani
Postów: 206
Pomógł: 6
Dołączył: 25.12.2011

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


tak tak, wszystko jest tak jak napisałeś, pisałem z palca chodziło mi o zamysł. pole jest typu date jednakże indeks z tego co widzę ma małą moc - widnieje tam mała liczba - 19
no ale co tu zrobić dalej?
Go to the top of the page
+Quote Post
nospor
post 1.09.2016, 14:00:41
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




  1. EXPLAIN SELECT * FROM tabela WHERE `date` > '2016-07-31'

pokaz co wyswietla


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
wpaski
post 5.09.2016, 19:54:37
Post #5





Grupa: Zarejestrowani
Postów: 206
Pomógł: 6
Dołączył: 25.12.2011

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


całe zapytanie wygląda jak ponizej

  1. EXPLAIN SELECT wpis.id, wpis.datadodania, wpis.dzielnica, wpis.miasto, wpis.ulica, wpis.obrazek, wpis.cena, wpis.waluta, wpis.powierzchnia, wpis.kategoria, wpis.typ, wpis.kategoriaid, wpis.tytul, wpis.calkowitapowierzchnia, wpis.pietro
  2. FROM wpis, kategoria
  3. WHERE TRUE AND wpis.kategoria = kategoria.id
  4. AND kategoria.STATUS =1
  5. AND wpis.kategoria
  6. IN ( 2, 5 )
  7. AND naszStatus =5
  8. AND wpis.dataWygasniecia IS NOT NULL
  9. AND wpis.dataWygasniecia > '2016-09-05'
  10. ORDER BY wpis.datadodania DESC




  1. id select_type TABLE type possible_keys KEY key_len ref rows Extra
  2. 1 SIMPLE kategoria ref PRIMARY,STATUS STATUS 1 const 3 USING WHERE; USING INDEX; USING TEMPORARY; USING filesort
  3. 1 SIMPLE wpis ref kategoria,naszStatus,dataWygasniecia kategoria 3 wpisy.kategoria.id 158829 USING WHERE


co z tego wiadomo?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.06.2025 - 23:45