Mysql
 sql >> Base de données >  >> RDS >> Mysql

Index composites MySQL et opérateur BETWEEN

Votre style est très peu commun.

La plupart des gens écriraient probablement WHERE began_at < NOW() AND finished_at > NOW()

Cependant. Je recommanderais de mettre un index sur les deux champs.

Une clé combinée ne vous sera d'aucune utilité car elle ne ferait qu'accélérer la recherche pour des combinaisons de dates spécifiques.

Eh bien, ce n'est pas tout à fait vrai car si vous utilisez betree, une clé combinée vous aidera mais pas aussi bien que si vous les indexez séparément. Les clés combinées sont très bonnes si vous recherchez des combinaisons de champs avec l'opérateur d'égalité (=). Les index de champ Single fonctionnent mieux dans les requêtes de ragen.

Vous pouvez google un peu pour "recherche de plage multidimensionnelle".

La raison en est que tous les champs correspondants dans un champ peuvent être trouvés en temps log(n) dans btrees. Ainsi, votre temps d'exécution global sera O(k*log(n)) qui est O(log(n)).

Les requêtes de plage multidimensionnelle ont un temps d'exécution de O(sqrt(n)) qui est plus élevé. Cependant, il existe également de meilleures implémentations qui permettent également une exécution logarithmique. Cependant, elles ne sont pas entièrement implémentées dans mysql, donc ce sera pire ou horrible selon la version.

Alors laissez-moi résumer :

  • Comparaisons d'égalité sur des champs uniques :index de hachage (exécution O(1))

  • Recherche par plage sur des champs uniques :index btree sur des champs uniques ( O(log(n)) )

  • Recherche d'égalité sur plusieurs champs :clé de hachage combinée (exécution O(1))

ces cas sont une chose claire...

  • Recherche par plage sur plusieurs champs :index btree séparés ( O(log(n)) )

c'est là que ce n'est pas si clair. avec les versions actuelles, il est clairement préférable d'indexer séparément pour les raisons indiquées ci-dessus. Avec une implémentation parfaite pour ce cas d'utilisation, vous pouvez obtenir de meilleures performances avec des clés combinées, mais aucun système ne sait qui le prend en charge. mysql prend en charge les index lâches (qui vous avez besoin pour cela) depuis la version 5.0, mais seulement très limité et l'optimiseur de requête ne les utilise que dans de rares cas, autant que je sache. ne connais pas les nouvelles versions comme 5.3 ou quelque chose comme ça.

cependant, avec mysql implémentant des index lâches, les clés combinées sur les champs où vous effectuez des requêtes de plage ou un tri dans différentes directions deviennent de plus en plus pertinentes.