Jonny 5: MySql: id IN( ... ) vs JOIN

Hallo liebes Forum,

ich suche schon eine Weile nach einer Lösung für folgendes Problem:

Ich möchte aus einer größeren Datenbank Datensätze in einer vorgegebenen ID-Reihenfolge holen. Bisherige Ansätze:

Variante 1
---------------------
SELECT * FROM my_table WHERE id IN(4,2,3,1)
ORDER BY id = 4 DESC,id = 2 DESC,id = 3 DESC,id = 1 DESC

Viel Text, wenn ~100 Ids geholt werden.

Variante 2 (mysli_multi_query)
---------------------
CREATE TEMPORARY TABLE buffer (id int(11)) TYPE=HEAP;
INSERT INTO buffer VALUES (4),(2),(3),(1);
SELECT b.* from buffer JOIN my_table b USING(id);
DROP TEMPORARY TABLE IF EXISTS buffer;

Vorteile:
-Keine lange Sortierschlange nötig.
-Weitere int/float Felder können unproblematisch addiert werden.

Nachteil: Meist werden die id-Tables (engine=memory) nicht im Speicher sondern auf der Platte generiert. Habe auch schon zb mit 'max_rows=100' ohne Erfolg getestet. Mehr als ~100 Ids stehen selten in solch einer Tabelle, also eigentlich nicht besonders speicherintensiv. Selbst wenn ich nur Ids in die Tabelle schreibe - ausschließlich INT - wird auf die Platte geschrieben.

tuning-primer.sh meint:
80-100% were created on disk.
Perhaps you should increase your tmp_table_size and/or max_heap_table_size

Habe schon sämtliche Limits in my.cnf angehoben ohne irgendeine Änderung.

Weiss jemand eine bessere/elegantere Lösung. Ich möchte Datensätze in einer vorgegebenen id (primary) Reihenfolge möglichst schnell aus der Datenbank.

herzliche Grüße,
Jonny 5

  1. Hallo Johnny,

    Ich möchte aus einer größeren Datenbank Datensätze in einer vorgegebenen ID-Reihenfolge holen.

    meiner Meinung nach ist es keine gute Idee, einer ID noch irgendetwas aufzubürden als die Identifikation eines Datensatzes.

    Weiss jemand eine bessere/elegantere Lösung. Ich möchte Datensätze in einer vorgegebenen id (primary) Reihenfolge möglichst schnell aus der Datenbank.

    SELFHTML hilft: Artikel Sortierfolgen in MySQL vorgeben.

    Freundliche Grüße

    Vinzenz

    1. Hi Vinzenz,

      SELFHTML hilft: Artikel Sortierfolgen in MySQL vorgeben.

      Danke für die rasche Antwort!

      Probiere gerade rum damit. Schon viel besser, als das like und temporary Zeux.

      herzliche Grüße,
      Jonny 5

    2. So, das läuft jetzt recht flott:

      http://www.moose.at/?q=html+forum

      Der große Buffer funktioniert noch über Heap-Tables (einmalig bei Suchanfrage) Der Page-Buffer geht über den neuen Id-Sort.

      Möchte mich an dieser Stelle auch bei allen bedanken, die mir immer wieder bei der Entwicklung von Moose.at geholfen haben, wenn ich als 'Moe' eine Frage gestellt habe.

      Stelle die Entwicklung mangels Ressourcen vorerst ein.

      herzliche Grüße und Dank,
      Jonny 5