Dans mon application Web, j'ai créé un système de messagerie interne. Je souhaite placer un lien "précédent" et un lien "suivant" sur chaque page (où l'utilisateur consulte le message).Optimisation des requêtes ORDER BY LIMIT dans MySQL
Afin d'obtenir le suivant et précédent id J'exercerai deux requêtes:
Pour le précédent:
SELECT id FROM pages WHERE (id<$requestedPageId) ORDER BY id DESC LIMIT 1
Et pour la prochaine:
SELECT id FROM pages WHERE (id>$requestedPageId) ORDER BY id LIMIT 1
EXPLAIN indique que le type de requête est "range" et la colonne rows indique qu'il examinerait toutes les lignes s id plus petit ou plus grand que l'id de la page (un grand nombre). La ligne Extra indique "Using where".
Il semble que MySQL ignore que je ne veux qu'une ligne. MySQL n'est-il pas assez intelligent pour optimiser ce type de requête afin qu'il trouve la ligne de la page et recherche la première ligne correspondante?
Y a-t-il une meilleure approche pour obtenir l'identifiant de la page suivante et précédente?
Notes complémentaires:
- Ce problème semble exister sur chaque ORDER BY requêtes de type LIMIT (par exemple .: lorsque je partage une longue liste de plusieurs pages.).
- Lorsque la clause n'est pas si simple (je souhaite laisser l'utilisateur accéder à la page suivante/précédente à laquelle il a accès.)
- Toutes les colonnes apparaissent dans WHERE sont indexées (id est la clé primaire)
- les variables sont protégées contre l'injection.
EDIT1:
Ainsi, la requête J'utilise actuellement:
SELECT id
FROM reports
WHERE (id<$requestedPageId) AND ((isPublic=1) OR (recipientId=$recipient))
ORDER BY id DESC
LIMIT 1
Ou quand je re-facteur comme la réponse dit:
SELECT MAX(id)
FROM reports
WHERE (id<$requestedPageId) AND ((isPublic=1) OR (recipientId=$recipient))
Il optimise les tables dans ce cas simple. Mais dès que je mets une condition supplémentaire à la clause where, il va examiner toutes les lignes. (Le type EXPLAIN sera ALL). Je vais éditer mon post original et j'ai mis dans la requête que j'utilise. – Calmarius
Avez-vous des index mis en place sur isPublic et recipientId? –