Pokud provedu to, co jste udělali výše, dostanu
EXPLAIN select * from stats_clicked s
join visitor v on s.visitor_id=v.id
+----+-------------+-------+------+---------------+--------+---------+--------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+--------+---------+--------------------+------+-------------+
| 1 | SIMPLE | v | ALL | PRIMARY | NULL | NULL | NULL | 15 | NULL |
| 1 | SIMPLE | s | ref | index3,index1 | index3 | 4 | so_gibberish2.v.id | 1 | Using index |
+----+-------------+-------+------+---------------+--------+---------+--------------------+------+-------------+
Pokud však zkrátím, provedu následující zatížení velkého množství dat (skončí s více než 100 000 řádky):
truncate table visitor;
insert into visitor (`visited_time`) values
(1467122944),(1467122944),(1467122944),
(1467122944),(1467122944),(1467122944),
(1467122944),(1467122944),(1467122944),
(1467122944),(1467122944),(1467122944),
(1467122944),(1467122944),(1467122944);
insert into visitor (`visited_time`) values
(1467122945),(1467122945),(1467122945),
(1467122945),(1467122945),(1467122945),
(1467122945),(1467122945),(1467122945),
(1467122945),(1467122945),(1467122945),
(1467122945),(1467122945),(1467122945),
insert into visitor (`visited_time`) values
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946);
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
select count(*) from visitor;
-- 104448 rows
Výsledkem je NE skenování tabulky:
EXPLAIN select * from stats_clicked s
join visitor v on s.visitor_id=v.id;
+----+-------------+-------+--------+---------------+---------+---------+----------------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+----------------------------+------+-------------+
| 1 | SIMPLE | s | index | index3,index1 | index3 | 9 | NULL | 22 | Using index |
| 1 | SIMPLE | v | eq_ref | PRIMARY | PRIMARY | 4 | so_gibberish2.s.visitor_id | 1 | NULL |
+----+-------------+-------+--------+---------------+---------+---------+----------------------------+------+-------------+
Důvod je uveden na stránce manuálu Jak MySQL používá indexy :
Důvod je uveden výše. V příkladu vaší otázky jste měli příliš málo řádků na to, aby se použití indexu vyplatilo. Takže db engine zvolil svůj údajně (a pravděpodobně) rychlejší způsob, jak index na vašem malém stole nepoužívat.