it-swarm.com.de

mySQL-Auswahl aus n letzten Zeilen

Ich habe eine Tabelle mit Index (Autoincrement) und Ganzzahlwert. Die Tabelle ist Millionen Zeilen lang.

Wie kann ich suchen, wenn eine bestimmte Anzahl in den letzten n Zeilen der Tabelle am effizientesten erscheint?

65
Nir

Ausgehend von der Antwort von @chaos, jedoch mit einigen Änderungen:

  • Sie sollten immer ORDER BY verwenden, wenn Sie LIMIT verwenden. Für eine RDBMS-Tabelle wird keine implizite Reihenfolge garantiert. Sie können normalerweise Zeilen in der Reihenfolge des Primärschlüssels erhalten, aber Sie können sich nicht darauf verlassen, noch ist es tragbar.

  • Wenn Sie in absteigender Reihenfolge nach bestellen, müssen Sie die Anzahl der Zeilen in der Tabelle nicht vorher kennen.

  • Sie müssen einer abgeleiteten Tabelle einen Korrelationsnamen (aka Tabellenalias) geben.

Hier ist meine Version der Abfrage:

SELECT `id`
FROM (
    SELECT `id`, `val`
    FROM `big_table`
    ORDER BY `id` DESC
    LIMIT $n
) AS t
WHERE t.`val` = $certain_number;
91
Bill Karwin

Vielleicht eine sehr späte Antwort, aber das ist gut und einfach.

select * from table_name order by id desc limit 5

Diese Abfrage gibt einen Satz der letzten 5 Werte (letzten 5 Zeilen) zurück, die Sie in Ihre Tabelle eingefügt haben

Letzte 5 Zeilen in MySQL abrufen

Diese Abfrage funktioniert einwandfrei

SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC

oder

select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc
13
M Palani Mca

Nutzen Sie SORT und LIMIT wie bei der Paginierung. Wenn Sie den i-ten Zeilenblock verwenden möchten, verwenden Sie OFFSET. 

SELECT val FROM big_table
where val = someval
ORDER BY id DESC
LIMIT n;

Als Antwort auf Nir: Die Sortieroperation wird nicht unbedingt mit einem Strafwert belegt. Dies hängt davon ab, was der Abfrageplaner tut. Da dieser Anwendungsfall von entscheidender Bedeutung für die Paginierungsleistung ist, gibt es einige Optimierungen (siehe Link oben). Dies gilt auch für Postgres "ORDER BY ... LIMIT ist ohne Sortierung möglich" E.7.1. Letzte Kugel

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 | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
12
Dana the Sane

weil es autoincrement ist, hier ist mein Take:

Select * from tbl 
where certainconditionshere 
and autoincfield >= (select max(autoincfield) from tbl) - $n
3
Michael Buen

Ich weiß, dass dies vielleicht ein bisschen alt ist, aber versuchen Sie es mit PDO::lastInsertId. Ich denke, es macht, was Sie wollen, aber Sie müssen Ihre Anwendung umschreiben, um PDO zu verwenden (was gegen Angriffe viel sicherer ist).

0
Luke Madhanga