Covering index e a ordem das colunas num índice composto
Pergunta
O que é um 'covering index' no MySQL/InnoDB e como a ordem das colunas num índice composto decide se ele serve uma query?
Resposta esperada
Um índice composto `(a, b, c)` é ordenado por a, depois b, depois c. Ele serve queries que filtram por um PREFIXO na ordem: `WHERE a = ?`, `WHERE a = ? AND b = ?`, `WHERE a = ? AND b > ?` — mas NÃO `WHERE b = ?` sozinho (não é prefixo), e um range no meio (`a = ? AND b > ? AND c = ?`) 'para' o uso do índice em `c`. Regra ESR (Equality, Sort, Range): colunas de igualdade primeiro, depois a coluna do `ORDER BY`, depois as de range. Covering index: quando o índice contém TODAS as colunas que a query precisa (do `WHERE` e do `SELECT`), o InnoDB responde só lendo o índice, sem ir buscar a linha na tabela (no InnoDB, ir à tabela = mais um lookup pela PK). O `EXPLAIN` mostra `Using index` quando é covering. Por isso às vezes vale incluir uma coluna extra no índice só pra ele 'cobrir' uma query quente.
Por que perguntam isso
Pergunta pleno/sênior de MySQL. Paralelo com o índice composto do Mongo. Sinal de domínio: regra ESR, `Using index`, 'incluir coluna extra pra cobrir'.