to pytanie typu "wykonaj moją pracę domową dla mnie", ale naprawdę utknąłem tutaj, próbując szybko wykonać to zapytanie względem tabeli z wieloma wierszami. Here's a SQLFiddle, który pokazuje schemat (mniej więcej).Zoptymalizuj zapytanie do tabeli z setkami milionów wierszy
Grałem z indeksami, próbując uzyskać coś, co pokaże wszystkie wymagane kolumny, ale nie odniosło dużego sukcesu. Oto create
:
CREATE TABLE `AuditEvent` (
`auditEventId` bigint(20) NOT NULL AUTO_INCREMENT,
`eventTime` datetime NOT NULL,
`target1Id` int(11) DEFAULT NULL,
`target1Name` varchar(100) DEFAULT NULL,
`target2Id` int(11) DEFAULT NULL,
`target2Name` varchar(100) DEFAULT NULL,
`clientId` int(11) NOT NULL DEFAULT '1',
`type` int(11) not null,
PRIMARY KEY (`auditEventId`),
KEY `Transactions` (`clientId`,`eventTime`,`target1Id`,`type`),
KEY `TransactionsJoin` (`auditEventId`, `clientId`,`eventTime`,`target1Id`,`type`)
)
I (wersja) select
:
select ae.target1Id, ae.type, count(*)
from AuditEvent ae
where ae.clientId=4
and (ae.eventTime between '2011-09-01 03:00:00' and '2012-09-30 23:57:00')
group by ae.target1Id, ae.type;
I skończyć z 'używanie tymczasowego' i 'Korzystanie filesort' a. Próbowałem zamiast tego usunąć count(*)
i zamiast tego użyć select distinct
, co nie powoduje "Używanie filesort". Prawdopodobnie byłoby to w porządku, gdyby istniał sposób na odzyskanie liczby od join
.
Pierwotnie podjęto decyzję o śledzeniu celów target1Name i target2Name celów, które istniały podczas tworzenia rekordu kontroli. Też potrzebuję tych imion (zrobię to ostatnio).
Obecnie zapytanie (powyżej, z brakującymi kolumnami target1Name i target2Name) działa w około 5 sekund przy rekordach ~ 24 miliony. Nasz cel jest w setkach milionów i chcielibyśmy, aby zapytanie dalej działało zgodnie z tymi zasadami (mając nadzieję, że uda nam się je zachować w ciągu 1-2 minut, ale chcielibyśmy, aby było o wiele lepiej), ale mój strach jest raz trafimy na większą ilość danych, których nie będzie (praca nad symulacją dodatkowych wierszy jest w toku).
Nie jestem pewien najlepszej strategii, aby uzyskać dodatkowe pola. Jeśli dodaję kolumny bezpośrednio do select
, tracę wskaźnik "Używanie indeksu" w zapytaniu. Próbowałem z powrotem do tabeli join
, która zachowuje "Indeks użycia", ale zajmuje około 20 sekund.
Próbowałem zmienić kolumnę eventTime na int, a nie na datetime, ale nie miało to wpływu na użycie indeksu lub czas.
Jaki jest Twój obecny moment kwerendy i co rozumiesz pod "szybko"? – feeela
Przepraszamy, dodano te szczegóły –
Czy masz indeksy na clientId i eventTime? Sprawdź również, czy masz te, które używają wskaźnika eventTime i nie wykonujesz pełnego skanowania tabeli. –