Hallo.
We hebben onlang de mogelijkheid gekregen om ruwe data van onze provider te ontvangen. We zijn dit nu aan het opzetten maar we lopen tegen een probleem aan bij het lezen uit de tabel met de gegevens(Dit zijn niet de hele logs, maar samengevatte gegevens speciaal voor een specifiek doel). In de tabellen zitten rond de 20 miljoen rijen.
Wanneer we de volgende query draaien, dan blijft die in MySQL tussen de 8 en 10 minuten op statistics staan.
Dit is de query:
De tabel waar de data uitkomt:
De 1 miljoen rijen komen uit de onderstaande tabel, de userid's worden geselecteerd op segmentid, 1 user kan meerdere segmenten hebben en natuurlijk geld dit andersom ook. We kunnen de queries niet combineren omdat wanneer we dit doet de query elke keer de 1 miljoen rijen gaat ophalen voor elke rij die hij controleert.
Table:
We hebben al van alles geprobeerd om dit te versnellen.
Terwijl we dit aan het doen waren hebben we ook dit ontdenkt: Wanneer we het statement "Date = '2010-10-04'" veranderen in "('2010-10-05' >= Date AND Date >= '2010-10-04')" loopt de query minder dan 1 minuut.
De keys zijn ook gecontroleerd, hij gebruikt gewoon keys bij deze query staat bij het explain statement uitgelegd.
Heeft iemand een idee waar het aan kan liggen dat deze query zolang in statistics blijft hangen wanneer we een enkele datum mee geven? En heeft iemand een ander idee dan een subquery in de probleem query te stoppen om niet 1 miljoen userid's te hoeven mee geven aan de probleem query.
We hebben onlang de mogelijkheid gekregen om ruwe data van onze provider te ontvangen. We zijn dit nu aan het opzetten maar we lopen tegen een probleem aan bij het lezen uit de tabel met de gegevens(Dit zijn niet de hele logs, maar samengevatte gegevens speciaal voor een specifiek doel). In de tabellen zitten rond de 20 miljoen rijen.
Wanneer we de volgende query draaien, dan blijft die in MySQL tussen de 8 en 10 minuten op statistics staan.
Dit is de query:
code:
1
2
3
4
5
6
7
8
9
10
11
| SELECT sum(Impressions) as Imps, country FROM auctions WHERE userid in (11,45,45...,564) //about 1 million id's; no duplicates. AND( PublisherId = 10 OR PublisherId = 12 ) AND Country = "NL" //wordt niet altijd mee gegeven AND Date = "2010-10-04" GROUP BY Country |
De tabel waar de data uitkomt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| DROP TABLE IF EXISTS `adx_raw_data`.`auctions`; CREATE TABLE `adx_raw_data`.`auctions` ( `UserId` bigint(20) unsigned NOT NULL, `PublisherId` int(10) unsigned NOT NULL, `Date` date NOT NULL, `Country` varchar(2) NOT NULL, `Impressions` int(10) unsigned NOT NULL, PRIMARY KEY (`Country`,`Date`,`PublisherId`,`UserId`), KEY `Index_CombinedPub` (`Date`,`UserId`,`PublisherId`,`Country`), KEY `Index_CombinedCountry` (`Date`,`UserId`,`Country`), KEY `Index_Date` (`Date`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; |
De 1 miljoen rijen komen uit de onderstaande tabel, de userid's worden geselecteerd op segmentid, 1 user kan meerdere segmenten hebben en natuurlijk geld dit andersom ook. We kunnen de queries niet combineren omdat wanneer we dit doet de query elke keer de 1 miljoen rijen gaat ophalen voor elke rij die hij controleert.
Table:
code:
1
2
3
4
5
6
7
8
| DROP TABLE IF EXISTS `adx_raw_data`.`segments`; CREATE TABLE `adx_raw_data`.`segments` ( `SegmentId` int(10) unsigned NOT NULL, `UserId` bigint(20) unsigned NOT NULL, PRIMARY KEY (`SegmentId`,`UserId`) USING BTREE, KEY `Index_UserId` (`UserId`), KEY `Index_Segment` (`SegmentId`) USING BTREE ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED; |
We hebben al van alles geprobeerd om dit te versnellen.
Terwijl we dit aan het doen waren hebben we ook dit ontdenkt: Wanneer we het statement "Date = '2010-10-04'" veranderen in "('2010-10-05' >= Date AND Date >= '2010-10-04')" loopt de query minder dan 1 minuut.
De keys zijn ook gecontroleerd, hij gebruikt gewoon keys bij deze query staat bij het explain statement uitgelegd.
Heeft iemand een idee waar het aan kan liggen dat deze query zolang in statistics blijft hangen wanneer we een enkele datum mee geven? En heeft iemand een ander idee dan een subquery in de probleem query te stoppen om niet 1 miljoen userid's te hoeven mee geven aan de probleem query.