Directorio de artículos
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('目标字段')