ten test miały sens gdyby był wykonywany na jednej tabeli lub na identycznych kopiach
co w tym dziwnego że czasy były różne skoro w tabelach były różne ilości rekordów
CREATE TABLE test_count(
id int PRIMARY KEY AUTO_INCREMENT,
dane int NOT NULL DEFAULT 0
);
DROP PROCEDURE IF EXISTS wypelnienie ;
DELIMITER $$
CREATE PROCEDURE wypelnienie()
begin
DECLARE a INT DEFAULT 0 ;
forloop: LOOP
SET a=a+1;
INSERT INTO test_count VALUES(NULL,round(rand()*5000));
IF a=5000000 THEN
LEAVE forloop;
END IF;
END LOOP forloop;
end$$
DELIMITER ;
call wypelnienie();
CREATE TABLE test_count1 SELECT * FROM test_count;
CREATE TABLE test_count2 SELECT * FROM test_count;
CREATE TABLE test_count3 SELECT * FROM test_count;
SELECT count(*) FROM test_count1 WHERE id>99;
SELECT count(id) FROM test_count2 WHERE id>99;
SELECT count(1) FROM test_count2 WHERE id>99;
wynik
count(*) 0.281s
count(id) 0.294s
count(1) 0.285s
czyli można uznać że wyniki mieszczą się w granicach błędu.
Myślę że w tym przypadku niema żadnej różnicy ponieważ silnik mysql'a i tak skorzysta z klucza głównego.
Różnice będą wtedy gdy użyjesz kolumnę która nie jest kluczem głównym lub co gorsza jeśli nie jest na tej kolumnie nałożony indeks (oczywiście pomijam różnicę w wyniku jeśli są null'e )