web-dev-qa-db-fra.com

FORCE INDEX mySQL ... où puis-je le mettre?

J'ai la requête suivante de MySQL qui fonctionne parfaitement bien. Sauf que je dois ajouter un "FORCE INDEX" et je ne suis pas sûr de l'endroit où je dois le faire. J'ai essayé à peu près tous les emplacements et je reçois toujours une erreur MySQL. Qu'est-ce que je fais mal?

Voici la requête d'origine:

$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");

La requête est construite de cette façon afin que je puisse faire le "ORDER BY" avant le "GROUP BY", au cas où vous vous le demanderiez.

Ce que j'ai besoin d'ajouter, c'est:

FORCE INDEX (products_start_time)

Je l'ai essayé un peu partout sans succès, ce qui m'amène à penser qu'il y a quelque chose de plus complexe qui me manque?

34
user2643870

La syntaxe des indications d'index est documentée ici:
http://dev.mysql.com/doc/refman/5.6/en/index-hints.html

Index index va juste après la référence de la table:

  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

ATTENTION:

Si vous utilisez ORDER BY avant GROUP BY pour obtenir la dernière entrée par owner_id, vous utilisez un comportement non standard et non documenté de MySQL.

Rien ne garantit qu'il continuera à fonctionner dans les versions futures de MySQL, et la requête risque fort d'être une erreur dans tout autre SGBDR.

Recherchez dans la balise greatest-n-per-group de nombreuses explications sur de meilleures solutions pour ce type de requête.

57
Bill Karwin