Pour la requête:
WHERE NOW() >= date_from
AND NOW() <= date_to
Un indice de composé (date_from, date_to)
est inutile.
Créez les deux index: (date_from)
et (date_to)
et laissez l'optimiseur SQL décider à chaque fois lequel utiliser. En fonction des valeurs et de la sélectivité, l'optimiseur peut choisir l'un ou l'autre index. Ou aucun d'entre eux. Il n'y a pas de moyen facile de créer un index qui prendra en compte les deux conditions.
(Un index spatial pourrait être utilisé pour optimiser une telle condition, si vous pouviez traduire les dates en latitude et en longitude).
Mise à jour
Mon erreur. Un index sur (date_from, date_to, object_id)
peut et est effectivement utilisé dans certaines situations pour cette requête. Si la sélectivité du NOW() <= date_from
est suffisamment élevée, l'optimiseur choisit d'utiliser cet index plutôt que de faire un scan complet sur la table ou d'utiliser un autre index. En effet, il s'agit d'un index de couverture, ce qui signifie qu'aucune donnée n'est nécessaire pour être extraite de la table, seule la lecture des données de l'index est requise.
Note mineure (non liée à la performance, à l'exactitude de la requête seulement). Votre condition est équivalente à:
WHERE CURRENT_DATE() >= date_from
AND (CURRENT_DATE() + INTERVAL 1 DAY <= date_to
OR (CURRENT_DATE() = NOW()
AND CURRENT_DATE() = date_to
)
)
Êtes-vous sûr que vous voulez que ou voulez-vous ceci:
WHERE CURRENT_DATE() >= date_from
AND CURRENT_DATE() <= date_to
La fonction NOW()
retourne un DATETIME
, tandis que CURRENT_DATE()
retourne un DATE
, sans la partie du temps.
Je pense que date_from est préférable de créer un index au lieu de combiner –
Vous [probablement] ne vous sentez pas bien. Dites qu'il y a 10 lignes pour certains objets. 8 ont une date de fin dans le passé, 1 est "courant", et 1 est "futur". Combien de ceux-ci sont filtrés par "NOW()> date_from" (réponse: un seul) et combien sont filtrés par "NOW()