@zerkms correctly, reading all the rows in the table, MySQL decides that he will have to read most of the table anyway, so there is no need to read the index. The optimizer changes behavior if you select a subset of the table.
For example, I created a table like yours and populated it with 16384 rows with random integers from 0 to 1,000,000. Then I tried EXPLAIN for different subsets of the table, first 15% of the table, then 17%, then 19%.
mysql> EXPLAIN SELECT * FROM test where a < 150000 ORDER BY a; +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ | 1 | SIMPLE | test | range | kk | kk | 5 | NULL | 2272 | Using where | +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ mysql> EXPLAIN SELECT * FROM test where a < 170000 ORDER BY a; +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ | 1 | SIMPLE | test | range | kk | kk | 5 | NULL | 2560 | Using where | +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ mysql> EXPLAIN SELECT * FROM test where a < 190000 ORDER BY a; +----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+ | 1 | SIMPLE | test | ALL | kk | NULL | NULL | NULL | 16384 | Using where; Using filesort | +----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+
You can also convince him to use the index by reducing the columns until you just select the index columns. He decides to read the index one, and not touch the table. You can define an index with additional columns if you need, even if these columns are not needed for searching or sorting.
mysql> ALTER TABLE test ADD KEY kk2 (a,b); mysql> EXPLAIN SELECT a,b FROM test ORDER BY a; +----+-------------+-------+-------+---------------+------+---------+------+-------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+-------+-------------+ | 1 | SIMPLE | test | index | NULL | kk2 | 10 | NULL | 16384 | Using index | +----+-------------+-------+-------+---------------+------+---------+------+-------+-------------+
source share