onlyliuxin / coding2017

218 stars 643 forks source link

大家来聊聊工作中遇到的sql优化案例吧^o^ #545

Open caizhigang97 opened 7 years ago

caizhigang97 commented 7 years ago

对一个大数据量的表使用limit做分页。越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。如下: SELECT * FROM big_table WHERE name = 123 ORDER BY id LIMIT 10000, 20

此时,我们可以通过子查询的方式来提高分页效率: SELECT * FROM big_table WHERE id >= (SELECT id FROM big_table WHERE name = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10 原因: limit10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里。例如 LIMIT 500000 , 30 扫描了50万行,肯定会慢。所以采用上面的方式可以有效解决这个问题。 注:这里的is是已经索引过的。

欢迎各位兄弟姐妹积极留言呀。

gordonCN commented 7 years ago

is? or id?

gordonCN commented 7 years ago

另:子查询中仍旧使用limit 1000, 性能会有所提升吗?

Locker1995 commented 7 years ago

有人教过我,单条数据查询 select * from table a where a.xx=xxx 后面加上limit 1 查询速度会快很多