如何提高性能限制?,1时?是一个巨大的数字

时间:2011-03-30 07:56:06

标签: mysql performance limit

我有一种情况,我需要使用一个巨大的数字作为限制。例如,

"select * from a table limit 15824293949,1";
这是......真的很慢。有时我家的mysql服务器就死了。

是否可以加快速度?

抱歉,这个号码是 15824293949 ,而不是38975901200

加了:

**Table 'photos' (Sample)**

Photos
img_id img_filename
1       a.jpg
2       b.jpg   
3       c.jpg
4       d.jpg 
5       e.jpg
and so on
select cp1.img_id,cp2.img_id from photos as cp1 cross join photos as cp2 limit ?,1

我如何获得15824293949?

我的相册中有177901行。我可以使用

获得可能组合的总数

(总行数*总行数) - 总行数/ 2

3 个答案:

答案 0 :(得分:5)

MySQL存在MyISAM引擎的巨大限制偏移问题,其中InnoDB优化了这一点。有各种技术可以使MyISAM限制表现得更快,但是在select语句之前添加EXPLAIN以查看实际发生的情况。交叉连接生成的30亿行表明问题在于连接本身,而不是LIMIT子句。 如果您对如何使LIMIT表现得更快感兴趣,this link应该为您提供足够的信息。

答案 1 :(得分:2)

尝试使用带有索引的列上的WHERE子句限制查询。 E.g:

SELECT * FROM table WHERE id >= 38975901200 LIMIT 1

更新:我想也许您甚至不需要数据库?您可以通过计算15824293949 / 17790115824293949 % 177901之类的内容找到两个图像的第n个组合。我想你可以写一个查询:

SELECT (15824293949 / 177901) AS img_id1, (15824293949 MOD 177901) AS img_id2

如果你试图从他们在数据库中的自然顺序中获取它们(并且它们不是他们的img_id)那么你可能会有一些麻烦。有关系吗?目前尚不清楚你在这里要做什么。

答案 2 :(得分:1)

大概你在某种脚本中有这个,你看那个特定点的原因是因为它是你最后离开的地方。

理想情况下,如果您还有auto_increment主键字段(id),则可以存储该号码。然后从表中选择*,其中id> last_seen_id限制1(可能一次超过1次:P)

一般来说,你要求它做什么应该慢。给它一些东西来搜索,而不是一切都有限制。