Ma table 'mes_journaux' contient environ 20 000 000 enregistrements et je souhaite connaître le nombre de journaux que j'ai dans chaque date en quelques jours.La meilleure façon de convertir efficacement le fuseau horaire dans une requête MYSQL
Je veux avoir un résultat comme
+------------+---------+ | date | count | +------------+---------+ | 2016-07-01 | 1623 | | 2016-07-02 | 1280 | | 2016-07-03 | 2032 | +------------+---------+
Cette requête ci-dessous ne me prendre millisecondes pour terminer, ce qui est bon
SELECT DATE_FORMAT(created_at, '%Y-%m-%d') as date,
COUNT(*) as count
FROM my_logs
WHERE created_at BETWEEN '2016-07-01' AND '2016-07-04'
GROUP BY DATE_FORMAT(created_at, '%Y-%m-%d')
Le Expliquer de requête:
+------------+---------+-------+-----------------------------+ |select_type | table | type | possible_keys | +------------+---------+-------+-----------------------------+ | SIMPLE | my_logs| index | index_my_logs_on_created_at | +------------+---------+-------+-----------------------------+
+-----------------------------+---------+----------+ | key | key_len | rows | +-----------------------------+---------+----------+ | index_my_logs_on_created_at | 10 | 23458462 | +-----------------------------+---------+----------+
+-----------------------------------------------------------+ | Extra | +-----------------------------------------------------------+ | Using where; Using index; Using temporary; Using filesort | +-----------------------------------------------------------+
Cependant, je dois convertir le fuseau horaire de chaque enregistrement pour tenir le temps dans mon pays, et je dois groupe par l'information « Date », donc je dois convertir la colonne elle-même.
deux
SELECT COUNT(*)
FROM my_logs
WHERE DATE_ADD(created_at, INTERVAL 8 HOUR) BETWEEN '2016-07-01' AND '2016-07-04'
GROUP BY DATE_FORMAT(DATE_ADD(created_at, INTERVAL 8 HOUR), '%Y-%m-%d')
et
SELECT COUNT(*)
FROM my_logs
WHERE CONVERT_TZ(created_at, "+00:00", "+08:00") BETWEEN '2016-07-01' AND '2016-07-04'
GROUP BY DATE_FORMAT(CONVERT_TZ(created_at, "+00:00", "+08:00"),
'% Y-% m-% d')
prendre moi de 12s pour terminer la requête, il est insupportable lent !!
(Le Expliquer est la même que la requête en haut)
Je pense que ce problème est courant, mais je ne peux pas trouver une bonne façon de traiter avec elle, ce que quelqu'un a une plus efficace façon de le faire? Merci!
['convert_tz'] (http://dev.mysql.com/doc/refman/5.7/fr/date-and-time-functions.html#function_convert-tz) convertit d'un fuseau horaire à un autre. –
Pouvez-vous fournir les plans de requête (sortie 'EXPLAIN') pour les deux cas? – Vatev
J'ajoute la sortie! Merci. En fait, j'ai déjà la sortie que je veux, mais mon problème concerne l'efficacité. Après avoir examiné le problème du fuseau horaire, je ne peux pas trouver un moyen efficace de faire quelque chose qui, à mon avis, devrait être facile à l'origine. –