Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL usando índice diferente dependendo do valor limite com a consulta ORDER BY


É assim que as coisas acontecem. Tenha paciência comigo um minuto...

O Optimizer gostaria de usar um INDEX, neste caso ACTI_DATE_I. Mas ele não quer usá-lo se isso for mais lento.

Plano A:Use o índice.
  1. Acessar o índice estruturado BTree no final (por causa do DESC)
  2. Verificar para trás
  3. Para cada linha no índice, procure a linha correspondente nos dados. Nota:O índice tem (ACTIVITY_DATE, ACTIVITY_ID) porque a PRIMARY KEY é anexada implicitamente a qualquer chave secundária. Para acessar os "dados" usando o PK (ACTIVITY_ID) é outra pesquisa BTree, potencialmente aleatória. Portanto, é potencialmente lento. (Mas não muito lento no seu caso.)
  4. Isso para após LIMIT linhas.

Plano B:Ignore a mesa
  1. Digitalize a tabela, criando uma tabela tmp. (Provavelmente estará na memória.)
  2. Ordenar a tabela tmp
  3. Retire LIMIT linhas.

No seu caso (96 -- 1% de 10K) é surpreendente que ele tenha escolhido a varredura da tabela. Normalmente, o corte é algo em torno de 10% a 30% do número de linhas na tabela.

ANALYZE TABLE deveria causaram um recálculo das estatísticas, o que poderia convencê-lo a ir com o outro Plano.

Qual versão do MySQL você está usando? (Não, não conheço nenhuma mudança nessa área.)

Uma coisa que você pode tentar:OPTIMIZE TABLE ACTIVITIES; Isso reconstruirá a tabela, reempacotando os blocos e levando a potencialmente estatísticas diferentes. Se isso ajudar, gostaria de saber - já que normalmente digo "Otimizar tabela é inútil".