0

同じデータベースに 2 つのテーブルがDeviceありEventDataます。両方のテーブルには列accountIDとがありdeviceID、これらも主キーです。

Deviceテーブルには、 という名前の列がありますlinkDescription

テーブル内のいくつかの行を複製する必要があり、そのテーブル内で、列内EventDataにいくつかのテキストがあります。accountIDdeviceIDDevicelinkDescription

例:

デバイス テーブル

accountID  DeviceID linkDescription
12345       5800      444
12345       5700      445
12345       5500      null <--literally null
12388       4400      555
12388       4450      555

EventData テーブル

accountID  DeviceID timestamp
12345       5800      123335544
12345       5700      123335544
12345       5500      123335544
12388       4400      123335544
12388       4450      123335544
12345       5800      123335548
12345       5700      123335549
12345       5500      123335549
12388       4400      123335545
12388       4450      123335546

ここで、いくつかの行を複製し、 fromテーブルを使用してEventData変更する必要があります。したがって、次のデータがあります。accountIDlinkDescriptionDeviceEventData

accountID  DeviceID timestamp
12345       5800      123335544
12345       5700      123335544
12345       5500      123335544
12388       4400      123335544
12388       4450      123335544
12345       5800      123335548
12345       5700      123335549
12345       5500      123335549
12388       4400      123335545
12388       4450      123335546
444         5800      123335544 <-duplicated data with new accountID from here
445         5700      123335544
555         4400      123335544
555         4450      123335544
444         5800      123335548
445         5700      123335549
555         4400      123335545
555         4450      123335546

だから今、私はより大きなの一部になる次のクエリをテストしていますINSERT INTO:

explain 
select * 
from EventData
where 
    EventData.accountID in (
        select accountID 
        from Device 
        where Device.linkDescription > '0')
    and EventData.deviceID in (
        select deviceID 
        from Device 
        where Device.linkDescription> '0')
    and timestamp > (unix_timestamp(now()-interval 20 minute));

しかし、2 つ遅く、EXPLAINコマンドは次のように表示します。

ID   select_type           table      type            posible_keys    key   key_len  ref     rows     Extra
1    PRIMARY              EventData   ALL             null            null   null    null  47555718   Using where
3    DEPENDENT SUBQUERY    Device     ALL             null            null   null    null    8043     Using where
2    DEPENDENT SUBQUERY    Device     index_subquery    PRIMARY     PRIMARY    34    func     3       Using where

したがって、少なくとも私が理解しているように、テーブル全体をチェックしているため、非常に遅いのです。

どうすればやりたいことをより速く行うことができますか?

4

3 に答える 3

0

あなたの質問からあなたが何をしようとしているのかわかりませんが、JOIN物事をスピードアップするために使用する必要があります。あなたSELECTは次のようにもっと書くことができます:

SELECT EventData.accountID from
EventData
RIGHT JOIN Device
ON
(
    (
        Device.accountID = EventData.accountID
        OR Device.deviceID = Event.deviceID
    )
    AND Device.linkDescription> '0'
    AND timestamp > (unix_timestamp(now()-interval 20 minute))
);

おそらく、そこから がどのように機能するかを理解できるでしょうINSERT

于 2013-05-07T18:38:56.260 に答える
0

where条件の代わりに JOIN を使用することを検討してください。

select ed.*
from
    EventData as ed
    inner join Device as d1 on ed.accountId = d1.accountId
    inner join Device as d2 on ed.deviceId = d2.deviceId
where
    d1.linkDescription > '0'
    and d2.linkDescription > '0'
    and  ed.timestamp > (unix_timestamp(now()-interval 20 minute));

Deviceクエリを修正するためだけにテーブルを複製しています。両方の条件を同時に満たす必要がある場合は、Deviceテーブルを 1 回だけ使用します。

select ed.*
from
    EventData as ed
    inner join Device as d on ed.accountId = d.accountId and ed.deviceId = d.deviceId
where
    d.linkDescription > '0'
    and d.linkDescription > '0'
    and  ed.timestamp > (unix_timestamp(now()-interval 20 minute));

お役に立てれば

于 2013-05-07T18:41:28.383 に答える