MYSQL LIMIT

Feb 28, 2010 at 3:39 PM

SELECT * FROM `cdb_posts` WHERE pid >= (
    SELECT pid FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 1
) LIMIT 30

 

这样的效率更好

我做了一个Dbentry大表分页,到最后,慢的要死。在网上查了一下,原来走索引最快。

Feb 28, 2010 at 3:41 PM

虽然只有5W条数据,但是因为有一个大列所以慢了。

Coordinator
Mar 1, 2010 at 2:20 AM

你的这种写法也许会快一点儿,不过它隐含了一些假设:

  • 表里有一个叫pid的列,也许是自增关键列,也许是索引列,类型大致是int或long
  • OrderBy条件只和pid相关

这些假设并不见得能满足,另外,似乎外层的Select也需要有OrderBy,否则得到的仍然可能是乱序列表。

我不知道Mysql内部怎么处理Limit的,不过,如果确实是大列造成分页缓慢,可以把那个大列设置为LazyLoad。

Coordinator
Mar 1, 2010 at 1:12 PM

下面这种写法也许会好一点:

SELECT * FROM `cdb_posts` WHERE id IN (
    SELECT id FROM `cdb_posts` WHERE `xxx` > 100 AND `yyy` = 1 ORDER BY `CreatedOn` DESC LIMIT 1000000, 30
) ORDER BY `CreatedOn` DESC