Skriv frågan så här:
SELECT *
FROM orders
JOIN users ON orders.id_user = users.id
WHERE orders.status='new'
Ange inte vilka index som ska användas.
Börjar med WHERE
klausul, det ser ut som att det här kan vara användbar:INDEX(status)
. Men eftersom "status" låter som en "flagga" med låg kardinalitet, kan optimeraren bestäm dig för att ignorera indexet och gör helt enkelt en tabellskanning. Det här är OK. Det är OK eftersom det är snabbare att göra en tabellskanning än att studsa mellan ett index och data, när indexet inte är särskilt selektivt. I vilket fall som helst, lämna beslutet till optimeraren.
Nu när det handlar om orders
måste den JOIN
till users
. Det enda sättet att göra det är att ha ett index på id
. Det namnet ("id") antyder att det kan vara PRIMARY KEY
, är det? (Ange SHOW CREATE TABLE
.)
Den andra frågan du nämnde bör skrivas
SELECT * FROM users WHERE id=33
Och, som redan diskuterats, indexet (PRIMARY KEY
?) på id
är det rätta.
Det finns ingen fördel (för de givna SELECTs
). , åtminstone) för INDEX(status, id_user)
. Ditt urval inkluderar alla kolumner (*
); den hade bara hämtat id_user
, då skulle ett sådant index vara "täckande" och ha en viss fördel.