2015-07-28 85 views
1

我正在寻找一种方法来确保SELECT查询在给定的最大时间内返回,必要时返回部分结果。绑定的MySQL查询时间和部分结果保释

这是我面临的更详细的问题:

我有不少看起来像这样的表:

table name: user_1 

date  | object_id | row_id 
2015-05-13 | 0   | 1 
2015-05-13 | 0   | 2 
2015-05-14 | 0   | 3 
... 
2015-06-15 | 0   | 5000001 
2015-06-15 | 0   | 5000002 
2015-06-15 | 0   | 5000003 
2015-06-16 | 123  | 5000004 
2015-06-17 | 435  | 5000005 

我有类似的表为user_1user_1000

row_id有一个PRIMARY INDEX和date的INDEX。

我们正处于迁移过程中。所有新数据(2015-06-16之后)都会创建一个非零值object_id,过去的数据可以或不可以被迁移。如果2015-06-16之前的任何行具有非零的object_id字段,则会迁移表。

我试试就知道了,如果表中的数据与下面的请求迁移:

SELECT * FROM user_1 WHERE date < 2015-06-16 AND object_id > 0 LIMIT 1 

它按预期工作。数据迁移的速度很快(引擎快速找到匹配WHERE子句的行)。当数据未被迁移时(引擎解析所有行以确保没有任何内容符合WHERE子句)速度很慢。 object_id列没有索引,我无法创建一个索引。

要加快东西,我试图只读第一行:

SELECT object_id FROM user_1 ORDER BY date ASC LIMIT 1 

我在PHP代码测试object_id > 0。它总是很快,那很好。但我可以有假的否定结果,因为迁移过程有时不能迁移一排,在这种情况下object_id仍然是0.

我的第三次尝试是在给定的时间范围内搜索,以减少错误肯定的概率。

SELECT * FROM user_1 WHERE object_id > 0 AND date BETWEEN 2015-06-01 AND 2015-06-15 LIMIT 1 

事情是我不知道我有这些日期之间的所有user_*表中的行。在表格仍然迁移的情况下,可能在此日期范围内没有行。如果我设置较大的日期范围,则查询速度较慢。

所以,回到我的问题,我想做一个请求,搜索匹配我的WHERE子句的行,最多让我们说100ms。如果它在3ms中发现迁移的行,查询会很快返回,否则我会减少假阴性的情况,但我只在该尝试中花费100毫秒。

我知道我可以设置超时MySQL 5.7,但我坚持与MySQL 5.5。表引擎是TokuDB。还有PHP 5.5与PDO。类似于ElasticSearch's timeout的解决方案将是完美的。

感谢您的任何建议。

回答

0

我找到了一种方法来通过执行一个子请求来控制我的请求的执行时间。我不知道这是否是最好的方式,但我可以通过修改内部值LIMIT来间接推断执行时间。

设置LIMIT 10000LIMIT 100000快,但100000减少了假阴性的情况。

旧请求:

SELECT * FROM user_1 WHERE date < 2015-06-16 AND object_id > 0 LIMIT 1 

变得

SELECT * FROM (
    SELECT object_id FROM user_1 
    WHERE date < 2015-06-16 
    LIMIT 100000 
) s 
WHERE s.object_id > 0 
LIMIT 1