2014-10-17 35 views
0

我试图发现在我们庞大的数据库中的第一项,其中“富”刚开始出现,但此查询速度太慢:如何检查mysql数据库中的每个第N项?

select min(id) 
from mytable 
where data like '%foo%'; 

我很乐意以百万计算得到足够接近,但此查询似乎并没有跑得更快:

select min(id) 
from mytable 
where mod(id, 1000000) = 0 
and data like '%foo%'; 

任何想法如何让MySQL只检查每百万条目?我能想到的唯一的事情就是与第一整数一个临时表和连接上,通过1000000

+2

_“任何想法如何让mysql只检查每第100万条目?” - 这个问题意味着你甚至在这之前做错了事情。您应该(在正常情况下)在您告诉数据库_where_(或如何)搜索自己时不需要这种方法。很可能这个问题可以通过使用适当的索引来解决。 (尽管一个带有'like'%foo%'的通配符搜索当然是有问题的,并且该列的索引很可能不会解决这个问题,但是也不会试图干涉搜索是如何完成的。) – CBroe 2014-10-17 17:54:15

+0

数据太大而无法索引,特别是对于我的一个查询。 – 2014-10-17 18:03:37

+0

是否可以计算每个第n行的id并专门检索该行,然后测试其中的数据?它会很快,因为它会做索引查找。 – 2014-10-17 19:17:43

回答

0

你的第二个查询中的每个整数乘法是最有可能运行增加mod(id, 1000000) = 0的,因为MySQL必须检查它找到的每个id

为了让这个移动更快,你应该在data列上有一个索引。

同样,使用LIMIT可能会帮助你,像这样:

select min(id) 
from mytable 
where data like '%foo%' 
order by id 
limit 0,1000000 

,将搜索只有第0 - 10万行。如果你没有找到你想要的,然后增加限制 - 1000000, 2000000只看1000000 - 2000000行。

+0

谢谢,但我想每隔一百万行检查一次,而不是一次检查一百万行。 – 2014-10-17 18:05:27

+0

然后相应地更改限制。在你的情况下,将其更改为'999999,1000000'并相应地抵消。 'limit'是你的朋友。我认为这是一个比'where mod(id,1000000)= 0'更好的解决方案,其中mod(id,1000000)= 0'在第二个想法中强制计算每个*'id' – mmcrae 2014-10-17 18:52:20

+0

。你不想只检查每百万行,是吗?这是假设在第一百万行你会发现你的数据。你没有理由假设。 – mmcrae 2014-10-17 18:57:03

相关问题