sql >> Base de Datos >  >> RDS >> Mysql

MySQL son buenos mis índices?

Escriba la consulta de esta manera:

SELECT *
    FROM orders
    JOIN users  ON orders.id_user = users.id
    WHERE orders.status='new'

No especifique qué índices utilizar.

Comenzando con el WHERE cláusula, se parece a esto podría ser útil:INDEX(status) . Pero dado que "estado" suena como una "bandera" con baja cardinalidad, el optimizador puede decida ignorar el índice y simplemente haga un escaneo de la tabla. Esto está bien. Está bien porque es más rápido hacer un escaneo de tabla que rebotar entre un índice y los datos, cuando el índice no es muy selectivo. En cualquier caso, deje la decisión en manos del Optimizer.

Ahora que se trata de orders , necesita JOIN a users . La única forma de hacerlo es tener un índice en id . Ese nombre ("id") implica que podría ser la PRIMARY KEY , ¿Lo es? (Proporcione SHOW CREATE TABLE .)

Recetario índice

La otra consulta que mencionaste debe ser escrita

SELECT * FROM users WHERE id=33

Y, como ya se ha comentado, el índice (PRIMARY KEY ?) en id es lo correcto.

No hay ninguna ventaja (para los SELECTs dados , al menos) para INDEX(status, id_user) . Su selección incluye todas las columnas (* ); solo había obtenido id_user , entonces dicho índice estaría "cubriendo" y tendría alguna ventaja.