前提:
出现这种问题的原因是因为mysql在进行分页的时候,并不知直接插rows的数据,而是把offset和rows的数据全部查出来,然后再将offset的数据扔掉,返回rows的数据;
第一种解决办法:
symptom_id是主键,表里面221W数据
优化前####### 42s
select * from symptom ORDER BY create_date desc limit 2210000, 15
内连接优化后####### 7s
SELECT t1.* FROM symptom t1
INNER JOIN ( SELECT symptom_id FROM symptom ORDER BY create_date DESC LIMIT 2210000, 15 ) t2
ON t1.symptom_id = t2.symptom_id
7秒钟的时间大多花费在排序字段上,在create_date上建立索引后总耗时 0.5s !!!!!!!!!!!!!
第二种解决办法:
在业务允许的情况下限制页数,可以看到百度和google都是这么做的;
第三种解决办法:
如果id是连续自增的,可以用
select * from symptom where id > 1250000 limit 15