2016-07-26 14 views
2

Ich habe eine Abfrage, die eine wahnsinnig lange Zeit zur Ausführung braucht. Hier ist die Abfrage:Welche Spalten sollte ich indizieren?

SELECT * 
FROM `posts` 
WHERE `posts`.`id` IN (... MANY MANY DOZENS OF IDs ...) 
ORDER BY `created_at` DESC; 

Würde ich erstellen einen Index für nur id oder sowohl auf id und created_at?

+2

Sie können einen Index für beide erstellen, aber Ihr grundsätzlicher Ansatz ist fehlerhaft. Sie sollten diese IDs stattdessen in eine Tabelle einfügen und sich ihr anschließen. – bernie

Antwort

1

Für Ihre Abfrage ist ein Index nur auf posts(id) am besten. Wenn Sie nur eine id in der Liste hätten, könnten Sie posts(id, creaated_at) tun.

Wenn die order by ist die meiste Zeit nehmen, könnten Sie diese Version versuchen:

select p.* 
from (select p.* 
     from posts p 
     order by created_at desc 
    ) p 
where p.id in (. . .); 

Unter bestimmten Umständen könnte dies die Art verhindern, wenn Sie einen Index für posts(created_at) haben. Ich bin nicht begeistert von dieser Formulierung, weil es darauf ankommt, dass die Unterabfrage geordnete Ergebnisse zurückgibt - etwas, das in MySQL in der Praxis funktioniert.

+0

Wenn nur eine ID vorhanden ist, warum müssen Sie sie neu anordnen? – FrankerZ

+0

@FrankerZ. . . Wenn die ID eindeutig ist, wäre es nicht notwendig, sie neu zu ordnen. –

Verwandte Themen