validar - La mejor manera de probar si existe una fila en una tabla MySQL
validar si existe un registro en sql java (12)
Estoy tratando de averiguar si existe una fila en una tabla. Usando MySQL, es mejor hacer una consulta como esta:
SELECT COUNT(*) AS total FROM table1 WHERE ...
y verifique si el total no es cero o si es mejor hacer una consulta como esta:
SELECT * FROM table1 WHERE ... LIMIT 1
y comprobar si alguna fila fue devuelta?
En ambas consultas, la cláusula WHERE utiliza un índice.
A veces es muy útil obtener la clave primaria ( id
) de incremento automático de la fila si existe y 0
si no existe.
Aquí es cómo se puede hacer esto en una sola consulta:
SELECT IFNULL(`id`, COUNT(*)) FROM WHERE ...
Creo que vale la pena señalar, aunque se mencionó en los comentarios, que en esta situación:
SELECT 1 FROM my_table WHERE *indexed_condition* LIMIT 1
Es superior a:
SELECT * FROM my_table WHERE *indexed_condition* LIMIT 1
Esto se debe a que el índice puede satisfacer la primera consulta, mientras que la segunda requiere una búsqueda de fila (a menos que posiblemente todas las columnas de la tabla estén en el índice utilizado).
La adición de la cláusula LIMIT
permite que el motor se detenga después de encontrar una fila.
La primera consulta debe ser comparable a:
SELECT EXISTS(SELECT * FROM my_table WHERE *indexed_condition*)
Lo que envía las mismas señales al motor, pero aún escribiría el 1 para eliminar cualquier duda:
SELECT EXISTS(SELECT 1 FROM my_table WHERE *indexed_condition*)
Puede tener sentido agregar el EXISTS
si requiere un retorno explícito cuando no coinciden las filas.
En mi investigación, puedo encontrar el resultado en la siguiente velocidad.
select * from table where condition=value
(1 total, Query took 0.0052 sec)
select exists(select * from table where condition=value)
(1 total, Query took 0.0008 sec)
select count(*) from table where condition=value limit 1)
(1 total, Query took 0.0007 sec)
select exists(select * from table where condition=value limit 1)
(1 total, Query took 0.0006 sec)
He hecho algunas investigaciones sobre este tema recientemente. La forma de implementarlo debe ser diferente si el campo es un campo TEXTO, un campo no único.
He hecho algunas pruebas con un campo de texto. Teniendo en cuenta el hecho de que tenemos una tabla con 1M entradas. 37 entradas son iguales a ''algo'':
-
SELECT * FROM test WHERE texte LIKE ''%something%'' LIMIT 1
mysql_num_rows()
SELECT * FROM test WHERE texte LIKE ''%something%'' LIMIT 1
conmysql_num_rows()
: 0.039061069488525s. (MÁS RÁPIDO) -
SELECT count(*) as count FROM test WHERE text LIKE ''%something%
: 16.028197050095s. -
SELECT EXISTS(SELECT 1 FROM test WHERE text LIKE ''%something%'')
: 0.87045907974243s. -
SELECT EXISTS(SELECT 1 FROM test WHERE text LIKE ''%something%'' LIMIT 1)
: 0.044898986816406s.
Pero ahora, con un campo BIGINT PK, solo una entrada es igual a ''321321'':
-
SELECT * FROM test2 WHERE id =''321321'' LIMIT 1
withmysql_num_rows()
: 0.0089840888977051s. -
SELECT count(*) as count FROM test2 WHERE id =''321321''
: 0.00033879280090332s. -
SELECT EXISTS(SELECT 1 FROM test2 WHERE id =''321321'')
: 0.00023889541625977s. -
SELECT EXISTS(SELECT 1 FROM test2 WHERE id =''321321'' LIMIT 1)
: 0.00020313262939453s. (MÁS RÁPIDO)
Le sugerimos que no use Count
porque Count
siempre realiza cargas adicionales para el uso de db SELECT 1
y devuelve 1 si su registro allí, de lo contrario, devuelve nulo y puede manejarlo.
O puede insertar una parte de sql sin procesar en las condiciones, así que tengo ''conditions'' => array (''Member.id NOT IN (SELECT Membership.member_id DESDE membresías AS Membresía)'')
Para las tablas que no son InnoDB, también podría usar las tablas de esquema de información:
También puedes intentar usar
SELECT EXISTS(SELECT * FROM table1 WHERE ...)
por la documentación
Por un comentario a continuación:
SELECT EXISTS(SELECT 1 FROM table1 WHERE ...)
Un breve ejemplo de la respuesta de @ ChrisThompson
Ejemplo:
mysql> SELECT * FROM table_1;
+----+--------+
| id | col1 |
+----+--------+
| 1 | foo |
| 2 | bar |
| 3 | foobar |
+----+--------+
3 rows in set (0.00 sec)
mysql> SELECT EXISTS(SELECT 1 FROM table_1 WHERE id = 1);
+--------------------------------------------+
| EXISTS(SELECT 1 FROM table_1 WHERE id = 1) |
+--------------------------------------------+
| 1 |
+--------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT EXISTS(SELECT 1 FROM table_1 WHERE id = 9);
+--------------------------------------------+
| EXISTS(SELECT 1 FROM table_1 WHERE id = 9) |
+--------------------------------------------+
| 0 |
+--------------------------------------------+
1 row in set (0.00 sec)
Usando un alias:
mysql> SELECT EXISTS(SELECT 1 FROM table_1 WHERE id = 1) AS mycheck;
+---------+
| mycheck |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)
Una consulta COUNT es más rápida, aunque tal vez no sea notoria, pero para obtener el resultado deseado, ambas deben ser suficientes.
Yo iría con COUNT(1)
. Es más rápido que COUNT(*)
porque COUNT(*)
comprueba si al menos una columna en esa fila es! = NULL. No necesita eso, especialmente porque ya tiene una condición establecida (la cláusula WHERE
). COUNT(1)
lugar, prueba la validez de 1
, que siempre es válida y toma mucho menos tiempo para probar.
COUNT(*)
está optimizado en MySQL, por lo que es probable que la consulta anterior sea más rápida, en general.