J'ai une table avec index (auto-incrémentation) et une valeur entière. La table contient des millions de lignes.
Comment rechercher si un certain nombre apparaît le plus efficacement possible dans les n dernières lignes du tableau?
À partir de answer donné par @chaos, mais avec quelques modifications:
Vous devriez toujours utiliser ORDER BY
si vous utilisez LIMIT
. Aucun ordre implicite n'est garanti pour une table de SGBDR. Vous pouvez généralement obtenir des lignes dans l'ordre de la clé primaire, mais vous ne pouvez pas vous en fier, ni la rendre portable.
Si vous commandez par ordre décroissant, vous n'avez pas besoin de connaître le nombre de lignes de la table au préalable.
Vous devez donner un nom correlation (alias de table) à une table dérivée.
Voici ma version de la requête:
SELECT `id`
FROM (
SELECT `id`, `val`
FROM `big_table`
ORDER BY `id` DESC
LIMIT $n
) AS t
WHERE t.`val` = $certain_number;
Peut-être une réponse très tardive, mais c'est bon et simple.
select * from table_name order by id desc limit 5
Cette requête renvoie un ensemble de 5 dernières valeurs (5 dernières lignes) que vous avez insérées dans votre table.
5 dernières lignes récupérées dans mysql
Cette requête fonctionne parfaitement
SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC
ou
select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc
Tirez parti de SORT et LIMIT comme vous le feriez avec la pagination. Si vous voulez le ième bloc de lignes, utilisez OFFSET.
SELECT val FROM big_table
where val = someval
ORDER BY id DESC
LIMIT n;
En réponse à Nir: L'opération de tri n'est pas nécessairement pénalisée, cela dépend de ce que fait le planificateur de requêtes. Ce cas d'utilisation étant crucial pour les performances de pagination, il existe quelques optimisations (voir lien ci-dessus). Ceci est vrai aussi dans postgres "ORDER BY ... LIMIT peut être fait sans trier" E.7.1. Dernier point
explain extended select id from items where val = 48 order by id desc limit 10;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| 1 | SIMPLE | items | const | PRIMARY | PRIMARY | 4 | const | 1 | Using index |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
parce que c'est auto-incrémenté, voici mon point de vue:
Select * from tbl
where certainconditionshere
and autoincfield >= (select max(autoincfield) from tbl) - $n
Je sais que c'est peut-être un peu vieux, mais essayez d'utiliser PDO::lastInsertId
. Je pense que cela fait ce que vous voulez, mais vous devriez réécrire votre application pour utiliser PDO (ce qui est beaucoup plus sûr contre les attaques)