Suponha que eu tenha uma tabela com 1 milhão de linhas e muitas colunas. X e Y são duas das colunas varchar. Para 0,1% das linhas, tanto X quanto Y têm um valor. Para os outros 99,9% das linhas, tanto X quanto Y são nulos. Suponha que eu crie um índice BTree composto em (X,Y).
O MySQL vai indexar todos esses valores nulos?
Eu terei um ótimo desempenho quando consultar X sozinho ou X e Y juntos. Mas pagarei uma pequena penalidade toda vez que inserir ou atualizar um novo registro em que X e Y são ambos nulos?
Se você criar um índice em
table(col1, col2)
, e você fizer issoWHERE col1 = 'something' AND col2 = 'something'
, você explorará o índice; ele será muito seletivo. O mesmo comWHERE col1 = 'something'
.Mas
WHERE col1 IS NOT NULL
você teria que testar.WHERE col1 IS NULL
Examinaria a tabela porque o índice não é nada seletivo nessa situação.Atualizar um índice em INSERT ou UPDATE exige uma pequena sobrecarga. Este não pode ser um índice UNIQUE, então a carga de trabalho é um pouco menor. Mas não vale a pena se preocupar na maioria dos casos, a menos que sua carga de trabalho INSERT / UPDATE seja muito mais pesada do que sua carga de trabalho SELECT. Se você puder fazer as colunas terem,
COLLATE latin1_bin
você obterá os índices mais leves possíveis. Mas sem emoji, caracteres chineses ou insensibilidade a maiúsculas e minúsculas.