Cómo crear índices para campos de bytes largos en MySQL


Prefacio

Si el número de bytes de los datos del campo que se van a indexar es demasiado largo, se consumirá un rendimiento innecesario durante el proceso de búsqueda. Por lo tanto, este artículo describe cómo indexar razonablemente campos de bytes largos.


Sugerencia: El siguiente es el contenido de este artículo, los siguientes casos son para referencia

Método de indexación

1. Índice de prefijo

Dado que MySQL admite índices de prefijo, podemos crear un índice de prefijo para campos largos. La sintaxis es la siguiente:

alter table T add index index01(email(6));

La declaración SQL anterior es el índice de prefijo. Imagine que si se trata de un buzón QQ, los primeros seis dígitos son parte del número QQ, que ocupa poco espacio.

Pero, ¿y si no es un buzón QQ? Si los primeros 6 dígitos del buzón son cadenas, es muy probable que cause duplicación. Por ejemplo, [email protected]y [email protected], los primeros 6 caracteres son todos zhangs, pero esto aumentará el número de búsquedas.

Entonces, ¿ cómo elegir los dígitos del prefijo ?: Depende de la discriminación del índice. Si la discriminación del índice es grande, los dígitos del prefijo se pueden tomar menos

Aquí hay un algoritmo de referencia.

先计算出索引的区分度
select count(distinct 字段名) as dis from T\
然后依次尝试不同的前缀长度
select 
	count(distinct left(字段名,4)) as dis4,
	count(distinct left(字段名,5)) as dis5,
	count(distinct left(字段名,6)) as dis6,
	count(distinct left(字段名,7)) as dis7,
from T
由于使用前缀索引必然导致区分度下降 , 因此可以设定一个可接受范围,5%
然后计算出dis4~dis7中不低于dis*0.95的值,选中最小的长度做为前缀索引长度

Nota: el índice de prefijo y el índice de cobertura no se pueden usar al mismo tiempo

2. Almacenamiento en orden inverso

No hemos usado la tarjeta de identificación como índice antes, pero usar el almacenamiento flashback para indexar los últimos seis dígitos de la tarjeta de identificación puede proporcionar un mayor grado de discriminación.

3. Campo hash

Para usar el campo hash, debe crear otro campo entero en la tabla y luego realizar una crc32()operación hash ( ) en un campo para obtener el resultado.
Esto puede reducir la longitud del campo y mejorar la discriminación. Pero después del hash , solo puede realizar búsquedas equivalentes en el campo

alter table T add id_crc int unsigned ,add index(id_crc) //建立hash字段
select field from T where id_crc = crc32('目标字段')

Supongo que te gusta

Origin blog.csdn.net/qq_45596525/article/details/115056777
Recomendado
Clasificación