1

データの mysql テーブルがあり、ステータスが「非アクティブ」でなく、合計が 0 でない行のみを返す必要があります (ただし、ステータスが非アクティブで合計が 0 でない行が存在する可能性があります。逆)。この要件が必要になる前は、標準のクエリを実行してすべての行を選択していました。

SELECT * FROM tableName WHERE uid = id;

ただし、クエリを変更して上記の制約を追加すると、次のようになります。

SELECT * FROM tableName WHERE uid = id AND (status != "Deactive" OR Total != 0);

この一番下のクエリは、完了するまでにはるかに長い時間がかかります。なぜこれが起こっているのですか?このクエリを実行するためのより良い方法はありますか?

4

2 に答える 2

2

最初のクエリは、インデックスに基づいて検索しています (「uid」によるものと想定しています)。2 番目のクエリは、他の値をフィルタリングしています。これを実行すると、それを最適化する方法を理解するのに役立ちます:

EXPLAIN EXTENDED SELECT * FROM tableName WHERE uid = id AND status != "Deactive" OR Total != 0;

汚いですが、これはおそらく高速化する簡単な方法です。

SELECT 
  *
FROM 
(
  SELECT 
    * 
  FROM 
    tableName 
  WHERE 
    uid = id 
) as temp
WHERE
  temp.status != "Deactive" 
  OR temp.Total != 0;

これにより、大きなテーブル スキャンを実行する代わりに、最初に一致する uid を持つ行を取得し、次にそれらをフィルター処理するようにクエリが強制されます。前にも言ったように、EXPLAIN EXTENDED はあなたの友達です

于 2012-07-09T22:42:38.443 に答える
-1

各行のすべてのデータを返す必要がありますか? つまり、必要な列だけを選択すると、クエリの実行が速くなります。

また、「ステータスが「非アクティブ」でなく、合計が 0 でない行を返す」必要があるとも言っています。クエリは次のようになります。

SELECT * (or column names) FROM tableName WHERE uid = id AND status != "Deactive" AND Total != 0;

于 2012-07-09T22:56:55.393 に答える