J'ai une table sqlite actions
qui ressemble à ceci:optimisation des requêtes SQLite
uuid varchar (36)
actiondate int
username varchar (16)
mood int
bonus int
status varchar (80)
... bunch of other similar fields (all short varchar or int fields)
Cette conception semble être suffisamment performant pour la plupart des types de requêtes, mais les luttes un peu avec un scénario particulier, où J'ai besoin d'obtenir des données sur la dernière action effectuée par chaque utilisateur à une date donnée.
J'espérais pouvoir faire quelque chose comme ceci:
SELECT status, actiondate
FROM actions WHERE actiondate < 20061231
GROUP BY username
ORDER BY actiondate DESC
Cependant, l'agrégation ne se fait pas par rapport à la clause de l'ordre, la clause de commande détermine simplement quel ordre les résultats sont retournés dans, ce qui a du sens.
Alors, j'ai ceci:
SELECT actiondate, status FROM actions
WHERE actiondate < 20061231 and
uuid = (SELECT uuid from actions as alt
WHERE alt.username = actions.username
ORDER BY actiondate DESC LIMIT 1)
Y at-il une meilleure façon de faire ce genre de requête? Une meilleure disposition de la table? Actuellement, ce type de requête prend ~ 400ms sur ma boîte de développement, et ce serait bien si je pouvais raser 100ms environ (mon temps cible est en fait de 100ms, mais je suis sceptique quant à savoir si c'est gérable). J'ai évidemment des index sur le nom d'utilisateur et la date (j'en ai plusieurs: un qui correspond assez bien à la requête lente: un sur le nom d'utilisateur, un sur la date ASC, un sur la date DESC et un sur uuid). FWIW, la table action
est susceptible d'avoir entre 100 et 30 000 lignes.
Avec ces index, la durée de la requête est réduite à environ 273 ms, mais la contrainte sur l'augmentation des uuids n'est pas simple. Pensera à cette solution - merci! –
Mettez à jour la réponse pour inclure une discussion sur la distinction entre le «dernier enregistrement» et l'utilisateur. –
Merci - temps de requête jusqu'à environ 90ms avec vos modifications! J'aurais pu faire quelques changements qui pourraient ralentir un peu pour supprimer les «actions multiples pour une personne lors de leur dernière actiondate», mais cela semble vraiment prometteur. –