Se a coluna for indexada,
COUNT(DISTINCT id)
só precisa retornar o número de itens no índice da coluna. COUNT(id)
tem que somar o número de linhas para as quais cada entrada de índice aponta ou varrer todas as linhas. Para sua segunda pergunta, consulte count(*) e count(column_name), qual é a diferença? . Na maioria das vezes,
COUNT(*)
é o mais adequado; existem algumas situações, como a contagem de linhas unidas com uma junção externa, em que você precisa usar COUNT(columnname)
porque você não quer contar as linhas nulas.