I have a simple table
stock_ledger_id INT(10) (Primary) piece_to_bin_id INT(10) quantity INT(11) create_datetime TIMESTAMP ... and a few VARCHARs
with some simple indexes
Key_name Cardinality PRIMARY 1510443 piece_to_bin_id 100696
This fairly simple query takes about 8 seconds:
SELECT piece_to_bin_id, SUM(quantity), MAX(create_datetime) FROM stock_ledger GROUP BY piece_to_bin_id
Here's EXPLAIN:
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE stock_ledger ALL NULL NULL NULL NULL 1512976 Using temporary; Using filesort
I found that I can shift it to about 0.5 seconds by forcing the index:
SELECT piece_to_bin_id, SUM(quantity), MAX(create_datetime) FROM stock_ledger FORCE INDEX (piece_to_bin_id) GROUP BY piece_to_bin_id
Then EXPLAIN looks like this:
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE stock_ledger index NULL piece_to_bin_id 4 NULL 1512976
I am using MySQL 5.1.41, the MyISAM table and before I ran ANALYZE TABLE.
So, I'm stuck in "MySQL was wrong again, just forcing the index" or is there a real reason MySQL uses full table scanning? Maybe I can fix it?
source share