Напишете заявката по следния начин:
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 , тогава такъв индекс би бил "покриващ" и би имал известно предимство.