Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql]zliczanie ilości rekordów
Forum PHP.pl > Forum > Bazy danych
Mlodycompany
Witam. Przejdę od razu do rzeczy. Mam taką
  1. CREATE TABLE `hostsOnline` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `time` int(11) NOT NULL,
  4. `address` varchar(15) NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;


w której trzymam aktywne hosty w sieci. Mam crona, który dodaje co minute tyle rekordów ile jest aktywnych hostów w sieci. Czyli przykładowe dane wyglądają tak
Kod
time | address
1 | 192.168.1.1
1 | 192.168.1.2
1 | 192.168.1.3
2 | 192.168.1.1

--time jest unixtimem

Potrzebuje zapytanie, które zwróci mi jako wiersze wszystkie unikalne wartości z address, a jako kolumny ilość wystąpień wszystkich, w bieżącym miesiącu, tygodniu, dzisiaj, i stan obecny.

Kombinowałem robić podselecty

  1. SELECT
  2. ho.address,
  3. count(*) AS 'alltime',
  4. (SELECT count(*) FROM hostsOnline WHERE address = ho.address AND month(from_unixtime(time))=month(now()) AND year(from_unixtime(time)) = year(now())) AS 'thisMonth',
  5. (SELECT count(*) FROM hostsOnline WHERE address = ho.address AND week(from_unixtime(time))=week(now()) AND year(from_unixtime(time)) = year(now())) AS 'thisWeek'
  6. FROM hostsOnline ho
  7. GROUP BY ho.address


ale czas wykonania tego zapytania przy 110k rekordów jest niezbyt zadawalający, a w zapytaniu brakuje jeszcze kilku kolumn. Pytanie brzmi czy jest jakaś inna drogą aby wydobyć takie dane?
Pyton_000
na kolumnę time załóż indeks
Mlodycompany
założyłem indeks i szczerze powiedziawszy niewiele to pomogło
Pyton_000
wstaw przed select EXPLAIN i zobacz co wypluwa/
Mlodycompany
zwraca coś takiego
Kod
1    PRIMARY    ho    ALL                    111174    Using temporary; Using filesort
3    DEPENDENT SUBQUERY    hostsOnline    ALL                    111174    Using where
2    DEPENDENT SUBQUERY    hostsOnline    ALL                    111174    Using where
Pyton_000
Dodaj taki indeks usuwając poprzedni:
Kod
ALTER TABLE `hostsOnline`
    ADD INDEX `time_address` (`address`, `time`);
Mlodycompany
trochę pomogło. z 11 sekund do 2. ale i tak fajnie by było jakby było szybciej
Pyton_000
Szybciej to chyba będzie tylko jak IP upchniesz w INT za pomocą INET_ATON()
mmmmmmm
  1. SELECT
  2. ho.address,
  3. count(*) AS `alltime`,
  4. Count(case when month(from_unixtime(time))=month(now()) AND year(from_unixtime(time)) = year(now()) then address end) `thisMonth`,
  5. Count(case when week(from_unixtime(time))=week(now()) AND year(from_unixtime(time)) = year(now()) then address end) `thisWeek`
  6. FROM hostsOnline ho
  7. GROUP BY ho.address
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.