Estoy revisando un código que escribió un antiguo desarrollador, que ya no está. Encontré algo que no estoy muy seguro de que tenga sentido hacer, pero no creo que tenga suficiente conocimiento o Google Fu lo suficientemente bueno para encontrar la respuesta, así que aquí va:
El código se ve así:
var queryCount = SELECT COUNT(Col1) FROM MyTable WHERE ColumnInIndex = 'SomeValue' if(queryCount == 0) return []; var results = SELECT Col1, Col2, Col3,... FROM MyTable WHERE ColumnInIndex = 'SomeValue' return results;Así que mi primer pensamiento fue que parece redundante y debería usar los resultados de la consulta de selección en primer lugar. Busqué un poco más porque el compromiso sugiere que es para el ajuste de rendimiento.
Por lo que entiendo de buscar en Google, el conteo, de hecho, sería más rápido porque no tiene que devolver ningún dato ni extraer ninguna fila y puede confiar únicamente en el índice.
Sin embargo, en el pseudocódigo que he escrito anteriormente, el caso en el que la cláusula where no devolvería ninguna fila parece que no obtendríamos un aumento de rendimiento porque ni count ni select devolverían ningún resultado. Además, cuando hay resultados, hacemos dos de estas consultas en lugar de solo una.
Además, parece que, dado que estamos usando las filas en primer lugar, solo deberíamos obtener los datos en una consulta en lugar de hacer dos viajes a la base de datos.
¿Estoy completamente fuera de lugar aquí?
Estamos usando MySql v5.6.46
Estás en lo correcto. [¡Pero lee todo el camino hasta el final!]
Dos pasos son ineficientes, en cualquier versión de MySQL. Si no hay filas, el Optimizer hará esencialmente la misma cantidad de trabajo para SELECT .
Si hay algunas filas, entonces el primer SELECT es una pérdida de tiempo. Ver el acrónimo de programación 'KISS'.
El pseudocódigo implica que el 'retorno' es una matriz vacía; ¿Supongo que ese es el caso para cualquiera de las consultas cuando no hay una fila coincidente?
Una nota al margen: espero que ColumnInIndex signifique "una columna que es la primera en algún índice". Si la columna no es la primera, ninguna consulta utilizará el índice. (Este comentario no afecta la pregunta principal).
Otra nota al margen (dirigida a PTank): cuando no hay filas coincidentes, ninguna de estas
SELECT col FROM ... WHERE ... SELECT * FROM ... WHERE ... devolver cualquier fila; no devuelven NULL para la(s) columna(s). (El uso de * es 'malo' por múltiples razones que no están relacionadas con la pregunta original).
Ah, otro comentario más. COUNT(col) verifica que col no sea NULL antes de contar la fila. COUNT(*) simplemente cuenta las filas. En casi todos los casos, debe usar COUNT(*) ; es más simple, más rápido y probablemente da la misma respuesta. (La respuesta será la misma si col es la PRIMARY KEY ).
¡¡Caramba!! ¡Eso significa que su primera consulta no es redundante! El caso de bola impar es cuando col1 es NULL en cada fila. La primera consulta devolverá un recuento de cero, pero la segunda consulta devolverá algunas filas (con la primera columna NULL ).
¿Era una pregunta capciosa?