Optimizing ORDER BY for simple MySQL query
-
31-10-2019 - |
Question
I'm trying to optimize this really simple query, and it gives me grief for a day now :(
Seems pretty straightforward, I need to select with a JOIN from 2 tables, and get top X results sorted in a particular order. Here's the query:
SELECT * FROM `po`
INNER JOIN po_suppliers s ON po.supplier_id = s.id
ORDER BY po.id ASC
LIMIT 10
However, it runs really slow (half a second to 2 seconds). Here are table structures:
CREATE TABLE `po` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`supplier_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `supplier_id` (`supplier_id`)
) ENGINE=InnoDB AUTO_INCREMENT=457790 DEFAULT CHARSET=latin1
CREATE TABLE `po_suppliers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9386 DEFAULT CHARSET=latin1
Running EXPLAIN reveals the issue:
+----+-------------+-------+-------+---------------+-------------+---------+--------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-------------+---------+--------------+------+----------------------------------------------+
| 1 | SIMPLE | s | index | PRIMARY | PRIMARY | 4 | NULL | 480 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | po | ref | supplier_id | supplier_id | 4 | sergiis.s.id | 1 | Using index |
+----+-------------+-------+-------+---------------+-------------+---------+--------------+------+----------------------------------------------+
Can you help me figure out how I can optimize this to run faster? I have index on the column I sort by. I have index on columns I join by. If I remove the JOIN - it's crazy fast. If I remove ORDER BY, it's crazy fast. Why am I getting this dreaded temporary + filesort?
No correct solution
Licensed under: CC-BY-SA with attribution
Not affiliated with dba.stackexchange