2013-10-01 7 views
0

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!

+0

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? –

+0

@AlmaDoMundo Veuillez voir la question mise à jour. Merci. –

+1

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

Répondre

Questions connexes