在mysql中快速分页?

时间:2012-12-28 05:30:57

标签: mysql

我记得做where ... limit 100000 200很慢,因为mysql仍会扫描前100000行。获得超过100万行的花了很多秒(而不是毫秒)。无论如何,我正处于网站的设计阶段。我想使用多个标记进行搜索,例如cpp sockets

我正在尝试快速搜索。我认为我的选择是使用时间戳(最可能是64位int)或者使用最低/最高行#而不是使用页面#。但我想我可能需要走得那么远?

我想我需要一个查找表,所以如果帖子123456789有标签cpp socket我怎么把帖子插入查找表(lookupid,tagid,postid)中,并在tagid上有一个索引。弄清楚哪个具有最低计数(我使用count(*)还是更新一个保存当前计数的行?)然后我可以使用类似

的语句进行搜索
select postid from Post p join
(select postid from tag_lookup where tag=@tag_with_lowest_count and post_id<@post_id_limit) 
  as t2 on p.id=t2.postid
//i'm not sure how to write a where that checks if a post has every tag in a list.
where @array_length_as_a_param == (select count(*) from tag where tag.postid=p.postid 
  and in @array //dapper probably handles this for me. Unsure if this is connrect

我没有数据,表格,任何东西,所以我不能使用explain(我也读不好)。我正在集思广益。所以我使用&gt;或者&lt;取决于我是在做next / prev页面而是使用post_id而不是使用页码。

任何人都可以想到一个很好的正确的方法来获取随机标签上的快速页面查找吗?

1 个答案:

答案 0 :(得分:2)

  1. 使用select count([your-primary-key])代替*
  2. 在标签和帖子中使用postid上的索引。
  3. 使用连接而不是在where子句中测试相等性。
  4. 这只是粗略的一瞥。一旦你完成了这三个,如果它仍然不够高效,请发布查询解释的结果,我很乐意看看。