Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Optymalizacja wyniku
Forum PHP.pl > Forum > Bazy danych
daniel1302
Witam, mam zapytanie które oznacza mi co drugi wynik pewną flagą.
Chodzi mi głównie o zapytanie SELECT. Dla 6 000-10 000 rekordów działa spoko. Ale jak spróbuję przeedytować tabelkę 500000 rekordów to juz jest problem
Moja tabelka
  1. id|email|status|flag

I w co drugim rekordzi potrzebuję mieć 1 a w co drugim 0 maksymalnie równo rozłożone rekordy. Sortuję po czasie dodania rekordu (czyli ID), Przykłodowo musze równo podzielić maile np z przed dwóch lat.

Skrypt jest częściej wykorzystywany. Obecnie nie poradziłem sobie z jego uruchomieniem. Robię to tak, że eksportuję w ekselu usuwam odpowiendie wiersze, a te pozostałe oznaczam flagą i importuje do innej tabelki.

  1. SET @rowNumber = 0;
  2.  
  3. UPDATE adresy SET flag=1 WHERE id IN (SELECT t.id
  4. FROM (
  5. SELECT DISTINCT email, `status`, id, @rowNumber := @rowNumber+ 1 AS rn
  6. FROM adresy
  7. WHERE `status` IN (1, 3)
  8. GROUP BY email ORDER BY id
  9. ) t
  10. WHERE t.rn % 2 = 0 ORDER BY t.rn )


Jak to zoptymalizować jak uruchomić na tabeli pół miliona rekordów nawet konsola się wiesza.
Pyton_000
Na polu status masz indeks?
daniel1302
Pola status to poprostu statusy użytkowników. Określają jakie dane chcą otrzymywać. Nie mam indeksów
mmmmmmm
Jak chcesz szybko, to taki pomysł:
1. utwórz tabelę: ID AutoIncrement, tabID INT, Flag INT
2. przekopiuj do niej wartosci z twojej tabeli: INSERT INTO tabela (tabID) SELECT id FROM twoja_tabela
3. zupdejtuj tę nową tabelę: UPDATE tabela SET flag=(ID % 2)
4. załóż indeks na tabID
5. zupdejtuj swoją tabelę korzystając z tej
Pyton_000
@daniel1302 po moim poście sądziłem że dodasz ten indeks i przetestujesz... No cóż. Przeliczyłem się.
Załóż tam indeks zwykły i przetestuj.
daniel1302
Przetestowałem ale jeszcze nie zdążyłem odpowiedzieć bo jestem w pracy. Dzięki działa 5 min ale jest to już akceptowalny dla mnie wynik. + Dla ciebie oczywiście


Poczytałem o indeksach, jeśli masz jakieś propozycje ciekawych artykułów to proszę o podesłanie nt. MySQL. Podobają mi się bazy danych i planuję nauczyć się ORACLE.


mmmmm myślałem o twoim pomyśle, ale chciałem uniknąć tworzenia nowej tabelki bo przy rozmiarze tabeli 400 mb to troche zajmie. A zależy mi na szybkości.

Nie moge edytować, ale jak komuś to się przyda to dzisiaj wpadłem na optymalniejszy sposób wykonywnaia tego zapytania be widoku częściowego
  1. UPDATE tabela SET STATUS=(((@rowNumber:=@rowNumber+1)%2) +1) WHERE ... ORDER BY id ASC;



Na 500 tyś wykonuje się 2 sec
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.