Si la columna está indexada, COUNT(DISTINCT id) solo necesita devolver la cantidad de elementos en el índice de la columna. COUNT(id) tiene que sumar el número de filas a las que apunta cada entrada de índice, o escanear todas las filas.
Para su segunda pregunta, vea count (*) y count(column_name), ¿cuál es la diferencia?
. La mayoría de las veces, COUNT(*) es el más apropiado; hay algunas situaciones, como contar filas unidas con una unión externa, donde necesita usar COUNT(columnname) porque no desea contar las filas nulas.