1

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

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

我在想我需要一个查找表,所以如果帖子 123456789 有标签 cpp socket howto 我会将帖子插入到带有 tagid 索引的查找表(lookupid、tagid、postid)中。找出哪个计数最少(我是使用 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还不能使用(我读起来也很糟糕)。我在头脑风暴。所以我会使用 > 或 < 取决于我是否在做下一页/上一页并使用 post_id 而不是使用页码。

任何人都可以想出一种在我和在一起的随机标签上快速查找页面的好方法吗?

4

1 回答 1

2
  1. 使用select count([your-primary-key])而不是*.
  2. 在标签和帖子中的 postid 上使用索引。
  3. 在 where 子句中使用连接而不是测试相等性。

这只是粗略的一瞥。一旦你完成了这三个,如果它仍然不够性能,发布查询解释的结果,我很乐意看看。

于 2012-12-28T05:49:54.087 回答