Pregunta

Tengo un campo en una base de datos que es casi único: el 98% de las veces los valores serán únicos, pero puede tener algunos duplicados. No haré muchas búsquedas en este campo; decir dos veces al mes. La tabla actualmente tiene ~ 5000 registros y obtendrá unos 150 por mes.

¿Debería este campo tener un índice?

Estoy usando MySQL.

¿Fue útil?

Solución

Creo que el 'casi único' es probablemente un arenque rojo. Los datos son únicos o no, pero eso no determina si desea indexarlos por razones de rendimiento.

Respuesta:

5000 registros realmente no son muchos, e independientemente de si tiene un índice, las búsquedas seguirán siendo rápidas. A esa tasa de inserciones, le tomará 3 años llegar a 10000 registros, que aún no son muchos.
Personalmente, no me molestaría en agregar un índice, pero no importaría si lo hicieras.

Explicación:

Lo que debe tener en cuenta al decidir agregar un índice es el equilibrio entre la velocidad de inserción y la velocidad de selección.

Sin un índice, hacer una select en ese campo significa que MySQL debe recorrer cada fila y leer cada campo. Agregar un índice evita esto.

La desventaja del índice es que cada vez que se insertan datos, el DB tiene que actualizar el índice además de agregar los datos. Esto generalmente es una pequeña sobrecarga, pero realmente lo notarías si tuvieras un montón de índices y estuvieras haciendo muchas escrituras.

En el momento en que obtenga esta cantidad de filas en su base de datos, de todos modos querrá un índice, de lo contrario, sus selecciones tomarían todo el día, pero es algo que debe tener en cuenta para que no termine agregando índices en campos "por si acaso lo necesito"

Otros consejos

Eso no es muchos registros en absoluto; No me molestaría en hacer ningún índice en esa tabla. La singularidad relativa del campo es irrelevante: incluso en hardware de productos básicos de años de antigüedad, esperaría que una consulta en esa tabla tome una fracción de segundo.

puede usar la regla general: optimizar cuando se convierta en un problema. Simplemente no use un índice hasta que note que necesita uno.

Por lo que dices, no parece que sea necesario un índice. La regla general son los campos de índice que se utilizan mucho en SELECTS para acelerar la búsqueda, que a su vez (puede) ralentiza INSERTOS y ACTUALIZACIONES.

En un conjunto de registros tan pequeño como el tuyo, no creo que veas mucho éxito en el mundo real de ninguna manera.

Si solo va a hacer búsquedas en él dos veces al mes y son esas pocas filas, entonces diría que no lo indexe. Es todo menos inútil.

No. No hay muchos registros y no se consultará con frecuencia. No es necesario indexar.

Es realmente una decisión judicial. Con una tabla tan pequeña, puede buscar razonablemente rápido sin un índice, por lo que podría sobrevivir sin él.

Por otro lado, el costo de crear un índice que realmente no necesita es bastante bajo, por lo que no se ahorra mucho al no hacerlo.

Además, si crea el índice, estará cubierto para el futuro si de repente comienza a obtener 1000 nuevos registros / semana. Posiblemente sepa lo suficiente sobre la situación para decir con certeza que eso nunca sucederá, pero los requisitos tienen una forma de cambiar cuando menos lo espera.

EDITAR: en cuanto a los requisitos cambiantes, lo que hay que tener en cuenta es esto: si la base de datos crece y luego descubre que necesita un índice, ¿puede simplemente crear el índice y listo? ¿O también necesitará cambiar mucho código para utilizar el nuevo índice?

Depende. Como otros han respondido, hay una compensación entre la velocidad de actualización de la tabla y la velocidad de selección. La actualización de la tabla incluye inserciones, actualizaciones y eliminaciones en la tabla.

Una pregunta que no respondiste. ¿La tabla tiene una clave primaria y un índice correspondiente? Una tabla sin índices generalmente se beneficia de tener al menos un índice. La forma más común de obtener ese índice es declarar una clave primaria y confiar en el DBMS para generar un índice en consecuencia.

Si una tabla no tiene candidatos para la clave primaria, eso generalmente indica una falla grave en el diseño de la tabla. Esa es una cuestión aparte y debería tener una discusión pormenorizada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top