我正在寻找一种方法来确保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_1
到user_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的解决方案将是完美的。
感谢您的任何建议。