Mysql
 sql >> Database >  >> RDS >> Mysql

SELECT COUNT(*) è lento, anche con la clausola where

InnoDB utilizza chiavi primarie in cluster, quindi la chiave primaria viene archiviata insieme alla riga nelle pagine di dati, non in pagine di indice separate. Per eseguire una scansione dell'intervallo devi comunque eseguire la scansione di tutte le righe potenzialmente larghe nelle pagine di dati; nota che questa tabella contiene una colonna TESTO.

Due cose che proverei:

  1. esegui optimize table . Ciò garantirà che le pagine di dati siano archiviate fisicamente in ordine. Ciò potrebbe plausibilmente accelerare una scansione dell'intervallo su una chiave primaria in cluster.
  2. crea un indice non primario aggiuntivo solo sulla colonna change_event_id. Ciò memorizzerà una copia di quella colonna nelle pagine di indice che saranno molto più veloci da scansionare. Dopo averlo creato, controlla il piano di spiegazione per assicurarti che stia utilizzando il nuovo indice.

(probabilmente vuoi anche rendere la colonna change_event_id bigint non firmata se sta incrementando da zero)