MYSQL大LIMIT偏移量

时间:2010-12-10 01:23:07

标签: sql mysql query-optimization

我已经为此搜索了一个解决方案,但唉,不在后面。

目前,我的表正在从5000个不同来源推送5 800 000行。 E.G:

CREATE TABLE stores(
  store_id INT UNSIGNED PRIMARY_KEY AUTO_INCREMENT,
  name VARCHAR(255)
);

CREATE TABLE articles(
  article_id INT UNSIGNED PRIMARY_KEY AUTO_INCREMENT
  article_name CHAR(80),
  article_price INT UNSIGNED,
  store_id INT UNSIGNED
);

好的,所以我做了这样的索引:

CREATE INDEX article ON articles(store_id,name);

我认为我把它做成了防弹,猜不是。

当我搜索大型数据集时,有20万篇文章,我发布:

  SELECT article_name,
         article_price 
    FROM articles 
   WHERE store_id = $id 
ORDER BY article_name 
   LIMIT 100000,20;

获得非常大的回复时间。请帮忙? :S

2 个答案:

答案 0 :(得分:1)

是的,我想通了,因为没有人会帮助我:D

这个想法如下,当我请求某个页面时,我会执行以下操作:

CREATE TEMPORARY TABLE结果(row_id,article_id); SET @row:= 0; INSERT INTO结果SELECT @row:=(@ row + 1),article_id FROM articles ORDER BY $ sort $ order;

然后是一个简单的SELECT / JOIN:

SELECT * FROM结果 LEFT JOIN文章ON result.article_id = articles.article_id WHERE row_id> = $来自AND row_id< $到;

干杯...

答案 1 :(得分:0)

您是否在store_id和article_name上尝试了两个单独的索引?这可以允许MySQL进行更有效的过滤和排序。您还可以考虑将此查询移动到存储过程中,以便MySQL能够缓存执行/子结果集。如果这些都不起作用,您可能需要考虑该表上发生的插入/更新/删除操作的数量。如果它们很高,您可以考虑复制到发生所有读取操作的从属数据库。如果这些都不起作用,您可能需要升级硬件,因为MySQL应该能够非常轻松地处理这种大小的表。