¿Cuándo los índices de hash se vuelven razonables?


4

MySQL de forma nativa no soporta índices hash.Por lo tanto, hacer una columna de pseudo hash y crear un índice en una columna de hash necesita ser pensado.

Y parece entenderse ampliamente que si el campo de texto es largo, entonces los hashes valen la sobrecarga que requieren.Pero, ¿cuánto tiempo debe durar el texto para empezar a pensar en el hash?

Si pretendo usar el hash de 128 bits, ¿cuántos umbrales de umbral serían un mínimo suficiente para una columna de texto?

EditarDetalles enumerados en mi otra pregunta tal vez útil https://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram

  0

¿Cuál es su requerimiento?Un índice solo entra en juego cuando habrá consultas en una forma en que el optimizador de consultas las usará.¿Cuál es la naturaleza de los datos en cuestión?¿Qué tipo de consultas realizarás que involucren estos datos? 14 sep. 112011-09-14 18:18:53

  0

Aquí está la descripción del proyecto http://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram 14 sep. 112011-09-14 18:49:42

3

Su comienzo comienza a ser razonable cuando comienza a guardar su disco.Pero al mismo tiempo comienza a tomar su poder computacional.

Hoy en día, el espacio en disco se considera barato, pero si está usando SSD, entonces no es tan barato.Como necesita una coincidencia exacta, no necesitará demasiada CPU, por lo que puede ser una mejor opción.

Y la respuesta exacta de su pregunta sobre la longitud de la columna de texto para satisfacer el uso de hashes puede variar según la cantidad de factores que comienzan con la habilidad de DBA para cargar en el sistema.

Pero si guarda más del 50% de la RAM utilizando hashes y el ahorro total de RAM es de al menos 2 GB, entonces creo que vale la pena tomar esta ruta, de lo contrario es un ensayo innecesario.


3

No estoy seguro de cuáles son sus razones para querer un índice hash.

Pero si busca indexar columnas de texto/varchar, puede ir con MyISAM/texto completo o puede usar algo externo como Sphinx o Lucene.

Alternativamente, puede crear una columna adicional con una versión con hash de otra y siempre que tenga 1000 bytes o menos, luego MySQL puede indexarla.

Espero haber respondido a tu pregunta.

  0

Mi razón para buscar en el índice de pseudo hash es porque mi tabla contiene más de 150 millones de registros y tengo memoria limitada (8 GB), así que quiero optimizar mis índices y no quiero poner el índice en la columna de texto porque se consumirá demasiado RAM. 14 sep. 112011-09-14 17:55:51

  0

Puede (y debe) especificar la cantidad de caracteres de una columna de texto que le gustaría indexar.Como en mytextcolumn (1000) - 1000 es el límite.Permitiría que MySQL maneje la parte de memoria ya que es muy buena en ese lado.Alternativamente, usar Sphinx para estas cosas probablemente sea la herramienta más adecuada para el trabajo. 15 sep. 112011-09-15 06:58:59

  0

¿Por qué debo poner el índice en la columna de texto cuando tiene una longitud variable en lugar de crear una columna hash y poner una restricción única en la columna hash?El único problema al poner el índice en la columna hash es minimizar la colisión lo más bajo posible. 15 sep. 112011-09-15 16:42:11

  0

Puede crear otra columna con hash e indexarla, así como agregar su propio código a su aplicación para buscarla de esa manera.Solo diría que este es un problema que ya se ha resuelto utilizando otras herramientas y que otras personas han verificado en gran medida.Si desea ver si su camino funciona y es menos complejo, entonces todos mis medios, inténtelo. 16 sep. 112011-09-16 10:41:14

  0

En realidad, esas herramientas son para la solución de búsqueda de texto completo como la esfinge.Pero aquí estoy más interesado en saber cuándo será factible tomar 16 bytes de hashes.Al igual que, en lugar de almacenar 100 bytes de columna de texto (cuando se agrega un índice), vale la pena usar 16 bytes.Y lo que es más importante, solo se requiere una coincidencia exacta, no exploraciones de rango. 16 sep. 112011-09-16 18:45:01


0

Después de leer tu descripción, pude ver cómo un hash tendría sentido.Sin embargo, cuando se habla de la memoria, usar el tamaño de una columna de índice no hace que sea imposible buscar en un conjunto de datos de gran tamaño.La tecnología de índice básica de mysql es un btree.Btrees dividir y conquistar.

El consejo específico que puedo dar es el siguiente: supongamos que vas a usar un hash md5().Para lograr la máxima eficiencia, debe hacer que el hash sea la clave principal de las tablas de innodb engine donde el hash es un char (32).Ya que innodb tiene índices agrupados, la recuperación de los datos se guardará en las lecturas del disco, y también hay un trabajo reducido que debe realizarse cuando usa un char, como podrá hacerlo ya que el resultado del hash md5() nunca cambia .

  0

Cuando el propósito es ahorrar RAM, entonces usar InnoDB sería una decisión inteligente. 15 sep. 112011-09-15 16:44:51