Ich versuche, aggregierte Ergebnisse (insgesamt eindeutige IPs) aus einer Tabelle mit etwa 2 Millionen neuen Zeilen jeden Tag zu erhalten.Optimierung der SELECT-Anzahl (DISTINCT IP)
Die Tabelle:
CREATE TABLE `clicks` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`hash` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`type` enum('popunder','gallery','exit','direct') COLLATE utf8_unicode_ci NOT NULL,
`impression_time` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`source_user_id` int(11) NOT NULL,
`destination_user_id` int(11) NOT NULL,
`destination_campaign_id` int(11) NOT NULL,
`destination_campaign_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`destination_campaign_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`ip` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`referrer` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`country_code` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`country_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`country` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`isp` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`category_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`category` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`bid` float(8,2) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `ip` (`ip`),
KEY `source_user_id` (`source_user_id`),
KEY `destination_user_id` (`destination_user_id`),
KEY `destination_campaign_id` (`destination_campaign_id`),
KEY `clicks_hash_index` (`hash`),
KEY `clicks_created_at_index` (`created_at`),
KEY `campaign_date` (`destination_campaign_id`,`created_at`),
KEY `source_user_date` (`source_user_id`,`created_at`)
) ENGINE=InnoDB AUTO_INCREMENT=301539660 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Meine Frage:
SELECT SUM(ips_by_date.count) as count, ips_by_date.date as date
FROM (SELECT count(DISTINCT ip) as count, DATE(created_at) as date
FROM clicks as clicks
WHERE created_at BETWEEN '2016-05-22 00:00:00' AND '2016-05-23 23:59:59'
GROUP BY DATE(created_at)) as ips_by_date
GROUP BY date;
Nun nahm diese Abfrage 93 Sekunden für einen Tag zu laufen und ich fühle mich wie ich etwas fehle.
Gibt es irgendeine Optimierung, die ich machen kann, um die Leistung dieser einfachen Zählung zu beschleunigen?
Vielen Dank.
Ich habe Ihren vorgeschlagenen Index auf einer Teilmenge der heutigen Daten versucht, aber es ist zwar eine Verbesserung nicht viel. Was passiert, wenn ich diese eindeutige IP-Zählung nicht brauchen 100% genau zu sein? ist dies die Lösung ändern? ich weiß, dass in Elasticsearch können Sie die Leistung verbessern, wenn Sie die Genauigkeit handeln. Does etwas ähnliches in MySQL? Vielen Dank für Ihre Zeit. – user1782560
@ user1782560. Nicht zu meinem Wissen. Google BigQuery hat eine ungefähre Anzahl unterscheiden. Wie viele Zeilen gibt es? –