Eu preciso obter algumas estatísticas de nosso MySQL-DB e me pergunto se há uma maneira mais rápida de fazer isso.
Basicamente, preciso de informações sobre o registro do usuário em um determinado mês antes de incluir a separação por atributos.
por exemplo:
SELECT count(*) AS c
FROM `users`
WHERE `date_created` LIKE '2015-10%'
AND `country` = 'DE'
Isso retornaria um número para outubro de 2015. Como eu poderia alterar esta declaração para retornar resultados para todos os meses dentro de uma declaração?
Eu também estaria interessado em adicionar algo como AND confirmed = 1
um resultado separado.
Isso é possível com apenas uma instrução MySQL?
Duas coisas são necessárias para fazê-lo rodar mais rápido:
Obter índice adequado
Sem
confirmed = 1
, você precisaCom ele, você precisa
Evite esconder a data em uma função
LIKE '2015-10%'
não pode usar um índice emdate_created
, nem podeMONTH(date_created)
, então vamos reformular a consulta:(Isso pressupõe que
date_created
é um tipo de dadosDATETIME
ouTIMESTAMP
.)Todos os meses
Essa consulta ainda pode usar os dois índices que sugiro, porém não necessariamente usará a
date_created
parte.Nota sobre
country_code
Um erro comum na definição do esquema (forneça
SHOW CREATE TABLE
) é defini-lo comoCHAR(2)
padrão para utf8. Isso leva ao uso de 6 bytes, quando 2 seriam suficientes. Mude paraCHAR(2) CHARACTER SET ascii
.