2011-07-09 3 views
0

J'ai un tableau avec les champs suivants: userid, logintime, date de naissance
Je dois obtenir TOUS les utilisateurs entre la date de naissance X et Y commandés avec le plus récemment connecté en premier.mysql question result commande numéro

SELECT * 
FROM table 
WHERE birtdate BETWEEN x AND Y 
ORDER BY logintime DESC 

Si je définissais un index sur birtdate, MySQL utiliseraient filesort pour commander les résultats que je voudrais éviter (tableau commence à être grande, la requête est populaire).
Définition d'un index (logintime, date de naissance) ne me fait pas de sens puisque logintime est même pas dans la clause WHERE (je ne restreindre le jeu de résultats par date de naissance)

Toutes les solutions élégantes dans MySQL?

Répondre

0

L'index doit être birtdate, longtime (d'abord vous devez satisfaire la clause WHERE, puis l'ordre), mais je ne suis pas sûr qu'il peut utiliser l'index pour trier avec entre condition. Combien d'enregistrements faut-il trier? Comme la requête est populaire, vous pouvez utiliser le mécanisme memcache ou d'une autre mise en cache pour servir les résultats sans frapper la base de données

+0

Au moment de l'indice est uniquement sur la date de naissance, mais le filesort commence la tourbière de la base de données vers le bas. L'index est utilisé pour BETWEEN, ce qui n'est pas un problème. J'espérais qu'il y aurait une solution dans mysql qui ne nécessiterait pas de modules complémentaires (memcache) etc. – Rado

+0

voulez-vous essayer d'indexer birtdate, logintime (comme indiqué ci-dessus, l'ordre importe, index sur logintime, birtdate ne peut pas satisfaire la requête –

1

Ajout d'index sur birthdate,logintime devrait améliorer votre requête, mais il a ses inconvénients. Je crois que logintime (comme son nom l'indique) change fréquemment, donc le moteur de DB doit mettre à jour l'index sous-jacent qui à son tour provoquera la fragmentation d'index.
Je ne vois pas de gros problème avec filesort si votre requête est assez sélective et qu'un index sur birthdate est utilisé.
En outre, vous pouvez essayer de placer votre requête dans le corps de la procédure stockée; dans ce cas, mysql utilisera le cache plus efficacement que les requêtes ad-hoc.

0

AFAIK, ayant un index sur une colonne n'a pas d'effet de tri, uniquement sur la recherche - il aide le clause, pas l'ordre par clause.

EDIT: Suivez @ lien de Darhazer - est essentiellement dit « ORDER BY peut être satisfaite par un indice »

+0

Un index peut faciliter la recherche, le tri et le regroupement des résultats. – Rado

+1

@Bohemian lire [ORDER BY Optimisation] (http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html) –

+0

@Darhazer merci pour le lien. J'apprends encore! – Bohemian