我已经为此搜索了一个解决方案,但唉,不在后面。
目前,我的表正在从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
答案 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应该能够非常轻松地处理这种大小的表。