Considere una tabla de valores y hashes, así:
+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| val | char(9) | NO | | NULL | |
| val_hashed | char(50) | YES | | NULL | |
+------------+----------+------+-----+---------+----------------+
La siguiente consulta finaliza en 0.00 segundos:
SELECT * FROM hashes ORDER BY 1 DESC LIMIT 1;
Sin embargo, esta consulta toma 3 min 17 segundos:
SELECT val FROM hashes ORDER BY 1 DESC LIMIT 1;
Veo que mientras se ejecuta la consulta, la lista de procesos la muestra como estado Sorting result
. La situación es completamente reproducible. Tenga en cuenta que hay otro proceso que realiza INSERT
operaciones en la tabla continuamente.
¿Por qué la consulta más específica tardaría más en ejecutarse que la *
consulta? Siempre he creído que las *
consultas deben evitarse específicamente por razones de rendimiento.
ORDER BY NUMBER
sintaxis es bastante propensa a errores.
SELECT *
combinado con un índice de columna en ORDER BY
está ofuscando qué columna se está ordenando, otra razón para evitar *
s ...
*
que no es explícito. Así que decir "dame todas las columnas y ordenar por la tercera" es tan determinista como decir "ve al supermercado y dime cuántos semáforos pasaste"
id
para encontrar la primera fila. El segundo necesita ordenar el resultado completo en laval
columna (sin indexar) .