0

http://www.sqlfiddle.com/#!2/ee61b/3の例では、大きなデータを含む 2 つのテーブルがあります。

表1のように

CREATE TABLE `t1`(
  `id` int(4) ,
  `name` varchar(40),
  `signal` int(4)
)
;

INSERT INTO `t1`
(`id`, `name`, `signal`)
VALUES
    (1, 'a', 1),
    (2, 'b', 1),
    (3, 'c', 0),
    (4, 'd', 0)
;

そして表2のように

CREATE TABLE `t2`(
  `uid` int(4),
  `type` int(4),
  `usignal` int(4)
)
;

INSERT INTO `t2`
(`uid`, `type`, `usignal`)
VALUES
    (3, 1, 1),
    (1, 2, 1),
    (4, 1, 0),
    (2, 2, 0)
;

ここで、すべてのレコードに 1 のような条件付きを取得しようとします
。テーブル 1 のすべてのレコードはsignal= 1
2 です。OR(+) テーブル 1 のすべてのレコードはid(SELECT uid FROM t2WHERE t2.type = 1 AND t2.usignal = 1)にあります。

私はそのようにします

SELECT * FROM `t1` AS g1
WHERE g1.signal = 1
UNION 
SELECT * FROM  `t1` AS g1
WHERE g1.id
IN (
    SELECT uid
    FROM  `t2` AS g2
    WHERE g2.usignal = 1 AND g2.type = 1
)

しかし、私はその上でいくつかの条件を実行する必要があります(mybe join、...)そして私はそれを好きです

SELECT * FROM `t1` AS g1
WHERE g1.signal = 1
UNION 
SELECT * FROM  `t1` AS g1
WHERE g1.id
IN (
    SELECT uid
    FROM  `t2` AS g2
    WHERE g2.usignal = 1 AND g2.type = 1
)

/*dynamic other join query here */
and id>=1 /*dynamic conditional query here*/
order by id desc limit 0,20

データが小さい場合はうまく機能しますが、私のデータは大きく、実行中に失敗します

どうすればそれを行うことができますか

編集:
私のSQLはどうですか?それはゆっくり実行してタイムアウトさせますか?

Edit02:
私はphpmyadminを使用してインデックスをクリックし、t1(id, signal)http ://www.sqlfiddle.com/#!2/d88a9/1t2(type, unsignal)
の両方のテーブルの例にid主キーを追加し ます
が、実際には私のテーブルには約10列あります。そして、私は左結合を使用していますが、それはまだタイムアウトです:(

4

6 に答える 6

0

指標はありますか?適切なものを作成したことを確認してください。

( , ) タプルt1のインデックスが必要なようです。( , ) タプルのインデックスが必要です。idsignalt2usignaltype

これは、まだ持っていない場合にそれらを追加する方法です(ないテーブルの作成に従って):

create index 'id_signal_index' on t1 (`id`, `signal`);
create index 'id_usignal_index' on t2 (`usignal`, `type`);

通常、 のidようなテーブルで自動インクリメントを使用して主キーを設定することをお勧めしますt1

また、内部クエリを左結合クエリに変換します。これについては、他の回答で説明されています。

于 2013-09-17T07:26:41.893 に答える