SQL Rendement de l'Indice - vs ASC DESC
J'ai une table utilisateur de la clé sur une incrémentation automatique int colonne qui ressemble à quelque chose comme ceci:
CREATE TABLE `user_def` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(20) NOT NULL,
`date_created` datetime NOT NULL,
PRIMARY KEY (`user_id`),
UNIQUE KEY `user_name_UNIQUE` (`user_name`),
) ENGINE=MyISAM
Sont là toute pratique, les avantages de performance à l'aide d'un DESC de l'index (clé primaire) plutôt que la valeur par défaut de l'ASC?
Ma méfiance /raisonnement est comme suit:
Je suis en supposant que les plus récents, les utilisateurs vont être de plus actif (c'est à dire l'accès à la table plus souvent) et donc de rendre l'indice plus efficace.
Est ma compréhension correcte?
DESC
aurait pour effet de fragmenter votre indice de beaucoup lors de l'utilisation de AUTO_INCREMENT
sorte de répétition de la question... regarde ici: stackoverflow.com/questions/743858/...
Je ne pense pas qu'il y est aucun différence. La seule chose qui compte, c'est l'ordre de tri entre les colonnes, et uniquement dans le but de requêtes de plage.
OriginalL'auteur pjama | 2012-04-12
Vous devez vous connecter pour publier un commentaire.
Mise à jour de la Réponse de MySQL 8.0
Comme l'a noté Kazimieras Aliulis dans les commentaires, soutien pour la descente index est ajouté en MySQL 8.0:
Réponse originale à cette question pour les Versions Antérieures
DESC
indexation n'est actuellement pas implémenté dans MySQL... le moteur ignore la condition de tri et toujours utiliseASC
:Pour un autre RBDMS qui n'mettre en œuvre cette fonctionnalité, comme SQL Server, le
DESC
cahier des charges n'est utile que lors du tri par l'index composés... et ne pas avoir un impact sur le temps de recherche pour les utilisateurs nouvellement créés contre les utilisateurs plus âgés.DESC
l'indexation est toujours pas mis en œuvre comme des MySQL 5.7 selon la dernière documentationMerci pour la mise à jour, @CodeCommander ! Je pense que la réponse de Michael Fredrickson doit être mis à jour pour contenir cette mise à jour.
Mysql 8 va avoir desc index: dev.mysql.com/doc/refman/8.0/en/descending-indexes.html
OriginalL'auteur
De la MySQL 5.6 documentation:
ORDER BY col1 ASC, col2 DESC
calculé à partir de lacol1, col2
index?Ce n'est pas le cas, l'index n'est pas utilisé pour cela. À partir de dev.mysql.com/doc/refman/5.6/en/order-by-optimization.html: Dans certains cas, MySQL ne peut pas utiliser les indices pour résoudre l'ORDRE, même s'il utilise toujours des indices pour trouver les lignes qui correspondent à la clause where. Ces cas sont les suivants: [...] Vous mélangez les ASC et DESC
Il n'est donc pas possible de créer un index pour
ORDER BY col1 ASC, col2 DESC
dans MySQL?Si cela sonne comme si Elle signifie que si j'ai une table avec un champ int 10 000 000 identifiants et il a un index unique sur ce terrain, puis
select * from table where id=1
permettrait de résoudre un peu plus vite, puisselect * from table where id=10000000
?Peut-être en théorie, mais je n'ai pas trouvé dans la pratique de la performance de la différence entre l'indice de lecture vers l'avant ou vers l'arrière. En fait je l'ai essayé dès maintenant et repetetively trouvé
ORDER BY pk DESC LIMIT 1
plus vite queORDER BY pk ASC LIMIT 1
, bien que cette "différence" était bien à l'intérieur de la marge d'erreur.OriginalL'auteur
Un jour, j'ai été accordée par la simple mais brillante astuce, comment faire un ordre décroissant de l'indice de mysql: par le simple ajout d'une autre colonne négative (miroir de la valeur). Dites, pour les unsigned int il serait juste
value*-1
- donc, il travaille pour les timestamps unix.Pour varchars l'idée est similaire, mais la mise en œuvre est un peu plus complexe.
Le Sens Commun Hey! Je suis dans le besoin de l'indexation d'une requête à l'aide d'un tri décroissant. Pourriez-vous nous expliquer ce truc? N'a pas tout à fait le faire 🙁
faire une colonne dont la valeur est multipliée par -1. I. e. pour la valeur 1, la nouvelle colonne serait -1, pour 10 il serait -10 et ainsi de suite. Puis ajouter de l'indice pour cette nouvelle colonne. Trier par NCP et il va trier comme difficiles par les vieux de la colonne desc
Le Sens commun Ah c'est intelligent, merci pour le partage.
OriginalL'auteur
Dans MySQL définition de l'ASC ou DESC pour les index n'est pas seulement non pris en charge, mais il serait également inutile. MySQL peut parcourir les index dans les deux directions, de sorte qu'il ne nécessite pas de l'ordre à être défini explicitement.
OriginalL'auteur