Como criar índices para campos de bytes longos no MySQL


Prefácio

Se o número de bytes dos dados do campo a serem indexados for muito longo, algum desempenho desnecessário será consumido durante o processo de pesquisa. Portanto, este artigo descreve como indexar razoavelmente campos de bytes longos


Dica: O seguinte é o conteúdo deste artigo, os seguintes casos são para referência

Método de indexação

1. Índice de prefixo

Dado que o MySQL suporta índices de prefixo, podemos criar um índice de prefixo para campos longos. A sintaxe é a seguinte:

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

A instrução SQL acima é o índice de prefixo. Imagine que, se for uma caixa de correio QQ, os primeiros seis dígitos fazem parte do número QQ, que ocupa pouco espaço.

Mas e se não for uma caixa de correio QQ? Se os primeiros 6 dígitos da caixa de correio forem strings, é muito provável que cause duplicação. Por exemplo, [email protected]e [email protected], os primeiros 6 caracteres são todos zhangs, mas isso aumentará o número de pesquisas.

Então, como escolher os dígitos do prefixo ?: Depende da discriminação do índice. Se a discriminação do índice for grande, os dígitos do prefixo podem ser tomados menos

Aqui está um algoritmo para referência

先计算出索引的区分度
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: o índice de prefixo e o índice de cobertura não podem ser usados ​​ao mesmo tempo

2. Armazenamento de ordem reversa

Não usamos o cartão de identificação como um índice antes, mas usar o armazenamento flashback para indexar os últimos seis dígitos do cartão de identificação pode fornecer um maior grau de discriminação.

3. Campo de hash

Para usar o campo hash, você precisa criar outro campo inteiro na tabela e, em seguida, executar uma crc32()operação hash ( ) em um campo para obter o resultado.
Isso pode reduzir o comprimento do campo e melhorar a discriminação. Mas depois do hash , você só pode pesquisar equivalente no campo

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

Acho que você gosta

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