Напишете заявката по следния начин:
SELECT *
FROM orders
JOIN users ON orders.id_user = users.id
WHERE orders.status='new'
Не посочвайте какви индекси да използвате.
Започвайки с WHERE
клауза, изглежда, че това може бъде полезен:INDEX(status)
. Но тъй като „статус“ звучи като „флаг“ с ниска мощност, оптимизаторът може решите да игнорирате индекса и просто да сканирате таблицата. Това е наред. Добре е, защото е по-бързо да се направи сканиране на таблица, отколкото да се прескача между индекс и данни, когато индексът не е много селективен. Във всеки случай оставете решението на оптимизатора.
Сега, когато се занимава с orders
, трябва да JOIN
до users
. Единственият начин да направите това е да имате индекс на id
. Това име ("id") предполага, че може да е PRIMARY KEY
, Така ли? (Моля, предоставете SHOW CREATE TABLE
.)
Другата заявка, която споменахте, трябва да бъде написана
SELECT * FROM users WHERE id=33
И, както вече беше обсъдено, индексът (PRIMARY KEY
?) на id
е правилното нещо.
Няма предимство (за дадените SELECTs
, поне) за INDEX(status, id_user)
. Вашият избор включва всички колони (*
); беше изтеглено само id_user
, тогава такъв индекс би бил "покриващ" и би имал известно предимство.