0

次のような「入力」テーブルがあります。

id  subId   surveyId    name        val
1   1       1       Ip Addr     123.456.789
2   1       1       Cookie      abcdefghij
3   1       1       Time        2012-06-05 22:14:30
4   2       1       Ip Addr     123.456.789
5   2       1       Time        2012-06-05 22:14:40

subIdSubmission Id の略です。指定した時間後に特定のすべての提出物を取得したいsurvId。2つのステップがあります。まず、特定の時間の後にすべての提出 ID を取得します。これは次のように実行できます。

SELECT subId FROM Inputs WHERE surveyId=1 AND name='Time' AND val>'2012-06-05 22:14:35';

次に、これらの送信のすべての行を取得します。

SELECT * FROM Inputs WHERE subId IN (...);

...を最初のクエリの結果に置き換えると、すべて正常に動作します。最後の 2 行 (id 4 と 5) を返します。EXPLAINクエリ 1は次のとおりです。

id  select_type table   type    possible_keys   key     key_len ref     rows    Extra
1   SIMPLE      Inputs  range   Inputs_ix1  Inputs_ix1  1030    (null)  3       Using where

そしてクエリ2:

id  select_type table   type    possible_keys   key     key_len ref     rows    Extra
1   SIMPLE      Inputs  range   Inputs_ix2  Inputs_ix2  4       (null)  30      Using where

それらをプロファイリングすると、10,000 行で約 1 ミリ秒かかります。ここまでは順調ですね。しかし、私はそれらを組み合わせたいと思っています。これが私が試したことです:

SELECT * FROM Inputs WHERE subId IN (SELECT subId FROM Inputs WHERE surveyId=1 AND name='Time' AND val>'2012-06-05 22:14:35');

これには約 200 ミリ秒かかります。これはバグによるものだと思います。それでは、別のことを試してみましょう。

SELECT (@ids:=subId) FROM Inputs WHERE surveyId=1 AND name='Time' AND val>'2012-06-05 22:14:35';
SELECT @ids;

@idsここでは、最初のクエリの結果で変数を作成しようとしています。ただし、最後の id のみが変数に格納されます。MySQL 変数は配列では機能しませんか?!

誰でも私を助けることができますか?

4

1 に答える 1

0

1 つのクエリとして実行できます: (最初のクエリの 'subId' 部分を '*' に置き換え、'(NOLOCK)' を追加します)

SELECT * FROM Inputs (NOLOCK) WHERE surveyId=1 AND name='Time' AND val>'2012-06-05 22:14:35';

別のオプションは、INNER JOIN を使用することです。

SELECT Inputs2.* 
FROM Inputs AS Inputs1 (NOLOCK)
INNER JOIN Inputs AS Inputs2 (NOLOCK)
ON Inputs1.subId = Inputs2.subId
WHERE surveyId=1 
AND name='Time' 
AND val>'2012-06-05 22:14:35';

これらのオプションのタイミングがわかりません。

幸運を!

于 2012-06-07T15:48:55.123 に答える