requêtes de regroupement DATETIME Ceci est ma première tentative de demander de l'aide sur StackOverflow :)améliorer les performances
Je le tableau suivant:
CREATE TABLE `tinfinite_visits` (
`visit_id` int(255) NOT NULL AUTO_INCREMENT,
`identity_id` int(255) NOT NULL,
`ip` varchar(39) NOT NULL,
`loggedin` enum('0','1') NOT NULL DEFAULT '0',
`url` longtext NOT NULL,
`realurl` longtext NOT NULL,
`referrer` longtext NOT NULL,
`method` enum('GET','POST','HEAD','OPTIONS','PUT','DELETE','TRACE','CONNECT','PATCH') NOT NULL,
`client` longtext NOT NULL,
`referring` longtext NOT NULL,
`timestart` datetime NOT NULL,
`timeend` datetime NOT NULL,
PRIMARY KEY (`visit_id`),
KEY `timestart` (`timestart`),
KEY `identity_id` (`identity_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
À un moment donné, je dois obtenir des données de cette table pour générer un graphique linéaire. Je le fais actuellement en utilisant 5 requêtes différentes, pour 5 intervalles de temps différents (total, année, mois, semaine, jour).
La table compte actuellement environ 200 000 lignes, mais elle sera beaucoup plus grande (voire des dizaines de millions d'enregistrements).
Alors que mes requêtes fonctionnent parfaitement dans ce but, j'essaie de trouver une meilleure façon d'améliorer les performances.
Donc, j'apprécierais énormément tous les conseils/conseils sur la façon dont je peux améliorer les performances des requêtes, de préférence même fusionner les 5 requêtes en 1, si possible.
Les requêtes Je suis actuellement à l'aide, leur EXPLIQUE, ainsi que leurs temps d'exécution (pour environ 200,000 lignes) sont les suivantes:
requête Jour:
SELECT COUNT(DISTINCT(`identity_id`)) AS visits, DATE_FORMAT(CONVERT_TZ(timestart, '-5:00', '+3:00'), '%l%p') AS unit
FROM tinfinite_visits
WHERE `timestart` >= DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY unit
ORDER BY `timestart` ASC
expliquer brièvement:
+----+-------------+----------------------+-------+---------------+-----------+---------+-----+-------+------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------------+-------+---------------+-----------+---------+-----+-------+------------------------------+
| 1 | SIMPLE | tinfinite_visits | range | timestart | timestart | 8 | | 11113 | Using where; Using temporary |
+----+-------------+----------------------+-------+---------------+-----------+---------+-----+-------+------------------------------+
Heure: 0,011280059814453
requête Semaine:
SELECT COUNT(DISTINCT(`identity_id`)) AS visits, DATE_FORMAT(CONVERT_TZ(timestart, '-5:00', '+3:00'), '%a') AS unit
FROM tinfinite_visits
WHERE `timestart` >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY unit
ORDER BY `timestart` ASC
Expliquer:
+----+-------------+------------------+------+---------------+-----+---------+-----+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+------+---------------+-----+---------+-----+--------+----------------------------------------------+
| 1 | SIMPLE | tinfinite_visits | ALL | timestart | | | | 205897 | Using where; Using temporary; Using filesort |
+----+-------------+------------------+------+---------------+-----+---------+-----+--------+----------------------------------------------+
Heure: 0,13543295860291
requête Mois:
SELECT COUNT(DISTINCT(`identity_id`)) AS visits, DATE_FORMAT(CONVERT_TZ(timestart, '-5:00', '+3:00'), '%d') AS unit
FROM tinfinite_visits
WHERE `timestart` >= DATE_SUB(NOW(), INTERVAL 28 DAY)
GROUP BY unit
ORDER BY `timestart` ASC
expliquer brièvement:
+----+-------------+------------------+------+---------------+-----+---------+-----+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+------+---------------+-----+---------+-----+--------+----------------------------------------------+
| 1 | SIMPLE | tinfinite_visits | ALL | timestart | | | | 205897 | Using where; Using temporary; Using filesort |
+----+-------------+------------------+------+---------------+-----+---------+-----+--------+----------------------------------------------+
Heure: 0,21460795402527
requête Année:
SELECT COUNT(DISTINCT(`identity_id`)) AS visits, DATE_FORMAT(`timestart`, '%b') AS unit
FROM tinfinite_visits
WHERE `timestart` >= DATE_SUB(NOW(), INTERVAL 1 YEAR)
GROUP BY unit
ORDER BY `timestart` ASC
expliquer brièvement:
+----+-------------+------------------+------+---------------+-----+---------+-----+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+------+---------------+-----+---------+-----+--------+----------------------------------------------+
| 1 | SIMPLE | tinfinite_visits | ALL | timestart | | | | 205897 | Using where; Using temporary; Using filesort |
+----+-------------+------------------+------+---------------+-----+---------+-----+--------+----------------------------------------------+
Temps: 0.50977802276611
requête générale:
SELECT COUNT(DISTINCT(`identity_id`)) AS visits, DATE_FORMAT(`timestart`, '%b') AS unit
FROM tinfinite_visits
WHERE `timestart` >= DATE_SUB(NOW(), INTERVAL 100 YEAR)
GROUP BY unit
ORDER BY `timestart` ASC
Expliquer:
+----+-------------+------------------+------+---------------+-----+---------+-----+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+------+---------------+-----+---------+-----+--------+----------------------------------------------+
| 1 | SIMPLE | tinfinite_visits | ALL | timestart | | | | 205897 | Using where; Using temporary; Using filesort |
+----+-------------+------------------+------+---------------+-----+---------+-----+--------+----------------------------------------------+
Heure: 0,52196192741394
Merci, beaucoup!
L'optimisation prématurée sera toujours causer des ennuis. Combien de disques pensez-vous qu'il y aura? Qu'est-ce qui montre 'EXPLAIN' maintenant? –
@AlmaDoMundo Veuillez voir la question mise à jour. Merci. –
L'explication va changer avec le temps. En ce moment, il semble optimal. Il utilise où filtrer, puis stocke les valeurs groupées, puis les commande. – AdrianBR