2013-09-28 6 views
28

Ich habe die folgende mySQL-Abfrage, die perfekt funktioniert. Außer dass ich einen "FORCE INDEX" hinzufügen muss und ich bin mir nicht sicher wo ich das machen muss. Ich habe fast jeden Ort ausprobiert und bekomme immer einen mySQL-Fehler. Was mache ich falsch?FORCE INDEX mySQL ... wo stelle ich es hin?

Hier ist die ursprüngliche Abfrage:

$sql_select_recent_items = $db->query("SELECT * FROM (SELECT owner_id, product_id, start_time, price, currency, name, closed, active, approved, deleted, creation_in_progress FROM db_products ORDER BY start_time DESC) as resultstable 
WHERE resultstable.closed=0 AND resultstable.active=1 AND resultstable.approved=1 AND resultstable.deleted=0 AND resultstable.creation_in_progress=0 
GROUP BY resultstable.owner_id 
ORDER BY start_time DESC"); 

Die Abfrage auf diese Weise aufgebaut ist, so dass ich die „ORDER BY“ tun kann, bevor die „GROUP BY“, falls Sie sich fragen.

Was muss ich hinzufügen, ist:

FORCE INDEX (products_start_time) 

versuchte ich es fast überall ohne Erfolg, was dazu führt mich zu glauben, dass es etwas komplizierter ist, dass ich vermisst habe?

Antwort

39

Die Syntax für die Indexhinweise ist hier dokumentiert:
http://dev.mysql.com/doc/refman/5.6/en/index-hints.html

Index Index direkt nach dem Tabellenverweis gehen:

SELECT * FROM (
    SELECT owner_id, product_id, start_time, price, currency, name, closed, 
     active, approved, deleted, creation_in_progress FROM db_products 

    FORCE INDEX (products_start_time) 

    ORDER BY start_time DESC) as resultstable 
    WHERE resultstable.closed=0 
    AND resultstable.active=1 
    AND resultstable.approved=1 
    AND resultstable.deleted=0 
    AND resultstable.creation_in_progress=0 
    GROUP BY resultstable.owner_id 
    ORDER BY start_time DESC 

WARNUNG:

Wenn Sie‘ wieder verwenden ORDER BY vor GROUP BY, um den l zu bekommen Attest-Eintrag pro owner_id, Sie verwenden ein nicht standardisiertes und undokumentiertes Verhalten von MySQL, um dies zu tun.

Es gibt keine Garantie, dass es auch in zukünftigen MySQL-Versionen weiter funktioniert, und die Abfrage ist wahrscheinlich ein Fehler in anderen RDBMS.

Suchen Sie im Tag nach vielen Erklärungen für bessere Lösungen für diese Art von Abfrage.

+0

Vielen Dank! Das funktioniert perfekt und macht den Job für jetzt, während ich nach besseren Lösungen suche :) – user2643870

Verwandte Themen