web-dev-qa-db-fra.com

Optimiser les requêtes MySQL fonctionnant sur 50 millions de lignes

Existe-t-il une technique/des conseils afin d'optimiser les performances des requêtes ci-dessous?

Selon mes besoins, ma taille de dB moyenne sera d'environ 30 milles. rangées par jour, donc chaque seconde de moins, fera une énorme différence.

Mon moteur DB est innoDb et j'utilise 1 processeur central, avec 2 Go de RAM.

Temps d'exécution: 7,5 sections (5,5 mil. Lignes

SELECT vpn_group, username, from_interface_addr_ip
FROM SystemEventsR
WHERE (timestamp > ( NOW( ) - INTERVAL 10 MINUTE ) AND 
SysLogTagflag=1 AND 
username !='')
GROUP BY username

Temps d'exécution: 88,4 sec (5,7 mil. Lignes

SELECT syslogtagid, DeviceReportedTime, class, definition, SystemEventsR.SysLogTag,
COUNT(id) AS Records, 
explanation, action 
FROM SystemEventsR,oa_syslogtags
WHERE  (SystemEventsR.SysLogTag = oa_syslogtags.syslogtag AND 
flagid = 1 AND DATE(timestamp) = DATE(NOW()))
GROUP BY SystemEventsR.SysLogTag 
ORDER BY Records DESC

Toute aide serait appréciée.

3
Apostolos Traganis

Vos demandes ne sont que sur les dernières données. Vous pouvez essayer un partitionnement horizontal. Il est pris en charge dans MySQL 5.1 .

Une autre façon est de maintenir une "partition horizontale" manuellement. Par exemple, vous pouvez créer une table "SystemeventsR_Archive" et exécuter des requêtes ci-dessous tous les jours.

REPLACE INTO SystemEventsR_archive SELECT * FROM SystemEventsR;
DELETE FROM SystemEventsR WHERE timestamp < ( NOW() - INTERVAL 1 DAY );
1
user1931858