我有一种情况,我需要使用一个巨大的数字作为限制。例如,
"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
答案 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 / 177901
和15824293949 % 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)
一般来说,你要求它做什么应该慢。给它一些东西来搜索,而不是一切都有限制。