Estoy a punto de escribir una consulta que incluye un WHERE isok=1
. Como su nombre lo indica, isok
es un campo booleano (en realidad, TINYINT(1) UNSIGNED
se establece en 0 o 1 según sea necesario).
¿Hay alguna mejora en el rendimiento al indexar este campo? ¿El motor (InnoDB en este caso) funcionaría mejor o peor buscando el índice?
Respuestas:
Realmente no. Deberías pensar en ello como en un libro. Si solo hubiera 3 tipos de palabras en un libro y las indexara todas, tendría el mismo número de páginas de índice que las páginas normales.
Habría una ganancia de rendimiento si hay relativamente pocos registros de un valor. Por ejemplo, si tiene 1000 registros y 10 de ellos son VERDADEROS, sería útil buscar con
isok = 1
Como mencionó Michael Durrant, también hace que la escritura sea más lenta.
EDITAR: Posible duplicación: Indexación de campos booleanos
Aquí explica que incluso si tiene un índice, si tiene demasiados registros, no usa el índice de todos modos. MySQL no usa índice al verificar = 1, pero lo usa con = 0
fuente
Solo para poner un punto más fino sobre varias otras respuestas aquí, ya que en mi experiencia, aquellos que miran preguntas como esta están en el mismo barco que nosotros, todos hemos escuchado que indexar campos booleanos no tiene sentido, y sin embargo ...
Tenemos una tabla con aproximadamente 4 millones de filas, solo alrededor de 1000 o más a la vez tendrán un interruptor booleano marcado y eso es lo que buscamos. Agregar un índice en nuestro campo booleano aceleró las consultas en órdenes de magnitud, pasó de aproximadamente 9+ segundos a una fracción de segundo.
fuente
WHERE my_col > 0
en lugar demy_col = 1
también parece ayudar a la velocidadDepende de las consultas reales y de la selectividad de la combinación índice / consulta.
Caso A : condición
WHERE isok = 1
y nada más allí:Si el índice es lo suficientemente selectivo (digamos que tiene 1 millón de filas y solo 1k
isok = 1
), entonces el motor SQL probablemente usará el índice y será más rápido que sin él.Si el índice no es lo suficientemente selectivo (digamos que tiene 1 millón de filas y más de 100 mil
isok = 1
), entonces el motor SQL probablemente no usará el índice y hará un escaneo de tabla.Caso B : condición
WHERE isok = 1
y más cosas:Entonces, depende de qué otros índices tenga. Un índice en
another_column
probablemente sería más selectivo que el índice en elisok
que solo tiene dos valores posibles. Un índice en(another_column, isok)
o(isok, another_column)
sería incluso mejor.fuente
Depende de la distribución de los datos.
Imagine que tengo un libro con 1000 páginas escritas a máquina, y las únicas palabras en mi libro son "sí" y "no" repetidas una y otra vez y distribuidas al azar. Si me pidieran que encierre en un círculo todas las instancias de 'sí', ¿ayudaría un índice en la parte posterior del libro? Depende.
Si hubiera una distribución aleatoria mitad y mitad de sí y no, buscar en el índice no ayudaría. El índice haría que el libro fuera mucho más grande y, de todos modos, sería más rápido comenzar desde el frente y recorrer cada página buscando todas las instancias de 'sí' y rodeándolas, en lugar de buscar cada elemento en el índice y luego tomando la referencia de la entrada del índice a la página a la que se refiere.
Pero si hubiera, digamos, solo diez casos de 'sí' en mi libro de mil páginas y todo lo demás fueran solo millones de no, entonces un índice me ahorraría mucho tiempo para encontrar esos diez casos de 'sí' y rodearlos con un círculo. .
Lo mismo ocurre con las bases de datos. Si se trata de una distribución 50:50, entonces un índice no va a ayudar: el motor de la base de datos es mejor simplemente revisando los datos de principio a fin (escaneo completo de la tabla), y el índice simplemente agrandaría la base de datos, y más lento para escribir y actualizar. Pero si es algo así como una distribución de 4000: 1 (según oucil en este hilo), entonces una búsqueda de índice puede acelerarla enormemente, si es el 1 en 4000 elementos que está buscando.
fuente
No, normalmente no.
Por lo general, indexa los campos para la búsqueda cuando tienen una alta selectividad / cardinalidad. La cardinalidad de un campo booleano es muy baja en la mayoría de las tablas. También haría que sus escrituras fueran un poco más lentas.
fuente
En realidad, esto depende de las consultas que ejecute. Pero, en general, sí, además de indexar un campo de cualquier otro tipo.
fuente
Sí, un índice mejorará el rendimiento, verifique la salida de EXPLAIN con y sin el índice.
De los documentos:
Creo que también es seguro decir que un índice no DISMINUIRÁ el rendimiento en este caso, por lo que solo tiene que beneficiarse de él.
fuente
TINYINT(1) UNSIGNED
columna, el tamaño de los datos será pequeño.