2017-07-28 29 views
1

私は何かをしようとしているし、私は正しい方法でそれをやっていると確信しています。 -------------------------さんは、私は、次の列内部結合とforeachループのパフォーマンス

でMySQLデータベース内の2つのテーブルを持っているとしましょう

Members 
------------------------- 
id  name  status 
-----  -----  ----- 
1   Mike  0 
2   Alex  0 
3   John  1 
4   Jack  -1 

-------------------------

Status 
    ------------------------- 
    id  text 
    -----  ----- 
    -1  disapproved 
    0   reviewing 
    1   approved 

今、私は次のように表に「メンバー」の情報を表示する必要があります:

id  name  status 
-----  -----  ----- 
1   Mike  reviewing 
2   Alex  reviewing 
3   John  approved 
4   Jack  disapproved 

1つの方法は、2つのテーブル間で内部結合を使用し、もう1つの方法は、「メンバー」テーブルからデータを抽出し、それをfor-eachループの内側に置き、ステータス値を変換することです。後者の方法では、私は "ステータス"テーブルをまったく必要としません。

どちらの方が良いか分かりません。私を助けるために必要な情報が必要な場合はお知らせください。

ありがとうございます。

更新

アンのために、各例私がやりたいことのために、私は「Memberes」テーブルから一般的に

foreach($data as $value) 
    { 
    if ($value['status'] == 0) 
     $value['status'] = 'reviewing'; 
    if ($value['status'] == 1) 
     $value['status'] = 'approved';  
    else 
     $value['status'] = 'diapproved';   
    } 
+1

最も速いのはどのようなものなのかを知る方法はありません(特に、これらは実際のテーブルではなく、適用しようとしているロジックの例です)。それぞれのロジックごとにファイルを作成し、1,10,100,1000行などを取得するための時間を表示することで、それを自分でテストする必要があります。 – roberto06

+0

@ roberto06できることは確かです。 MySQLは常に高速になります。 MySQLのデータを取得し、<ここに言語を挿入する>のために設計されたデータベースを実行すると思うときはいつでも、「いいえ、MySQLはそれをより早く行います」という唯一の結論が出ています。あなたは測定する必要はありません。 – Mjh

答えて

4

データを抽出している想定し、このようなものです、あなたは絶対にしたいです

SELECT 
    t1.id, t1.name, t2.text AS status 
FROM Members t1 
INNER JOIN Status t2 
    ON t1.status = t2.id 

PHPコードの中でで処理する代わりにループはいくつかの理由で魅力的ではありません。まず、両方のテーブルからすべての情報を取り込む必要があり、メモリとネットワークの両方の観点から無駄です。その後、データを取り込んだ後でも、PHPを使用して結合を実行します。 PHPは実際に社内のデータベース操作用に設計されたものではなく、インデックスのようなものを使用してプロセスを高速化することはできません。

1

パフォーマンスの観点からは、ほとんどの場合、主キーの関係を使用する内部結合にはほとんどペナルティはありません。 MySQLはこのユースケースを正確に最適化するために長年を費やしてきました。これは、リレーショナルデータベースと呼ばれています。

この例では、数千万のユーザーであっても、適切なハードウェアで測定することはできません。

一方、コードサンプルは、これがひどい考えである理由を示しています。

あなたはタイプミスがあります。

else 
     $value['status'] = 'diapproved';   
    } 

「不承認」というのはあなたのデータベースが言うことだと思います。

情報を繰り返すので、バグの危険性があります。タイプミスを修正しなければならない開発者は、バグを修正するために2か所を見なければならないが、どちらが正しいか?データベース、またはPHPコード?

ステータス2 - needs validationを導入するとどうなりますか?今度は、2つの場所でコードを更新する必要があります(そして、それらの誤植に注意してください)。

パフォーマンスの向上が必要な場合があります。これはほぼ確実に一つではありません。そうであれば、クエリを最適化してデータベース内で解決してください。

関連する問題