【优化前】
SELECT `id` FROM `tab_a`
WHERE `city` = 4
ORDER BY `id` DESC
LIMIT 1000000 , 10 ;
-------------------
【说明】
limit原理是先读n条记录,然后抛弃这n条,读m条想要的。n越大,性能越差。这里n是 1000000了!
-------------------
【优化方案1】inner join 子查询
SELECT id
FROM table_a
WHERE city=4
INNER JOIN
(SELECT id
FROM table_a
WHERE city=4
ORDER BY id DESC
LIMIT 1000000 , 10)
USING (id)
------------------------
优化前有更多I/O开销:先读索引,再读数据,然后抛弃无需的1000000行。
优化后的SQL子查询只读索引就可以了,然后通过id直接读取需要的列。
------------------
【优化方案2】分表
上面可清楚看出把city分表掉,还会更快