2012-02-21 34 views
1

私は2つのテーブルがあります。 1つは、typeDBと呼ばれ、インデックス、タイプ名、およびこのタイプの他のテーブルの要素のIDのリストで構成される行があります。第二のテーブルから行を取得するには - dataDBそれを呼び出すことができます - タイプ0のは、私は、基本的に(ずさんな擬似コードで)行うことができます:どのMySQLクエリがより高速に取得できますか?

$list = SELECT list FROM typeDB WHERE index=0 

をそして私が使用してdataDBから行を取得できます。

$array = explode($list) 
for (every element of list $i) 
    $results = SELECT * FROM dataDB WHERE index=$array[$i] 

だから私の質問は...ですこれは任意の高速化だけでdataDBタイプフィールドを持つ、次に行うよりです:

$results = SELECT * FROM dataDB WHERE type=$type 

私の考えはベックということでした最初の方法は、データベース全体を通過する必要はありませんでしたが、それは速くなるでしょう。しかし、私は実際にどのようにデータベースクエリが動作するのか分かりません。どちらの方法で最も効率的だと思いますか?ありがとう。

答えて

1

型の列にインデックスを置き、2番目のバージョンを使用すると、はるかに高速になります。 また、データベースとは何か混乱していると思います。データベースはテーブル(トリガー、ストアドプロシージャ、ビューなど)のコレクションなので、somethingDBという名前のテーブルはちょっと混乱します。 私がindexと言うとき、私はデータベースインデックスを指しています(インデックスと呼ばれるカラムのようなものとは関係ありません)。

は、あなたが他のDBMSのコメントで育ったよう

ため

ALTER TABLE dataDB ADD COLUMN `type` varchar(64) 
CREATE INDEX type_index ON dataDB(type) 

同様の(MySQLの)このようなものを使用し、カラム、インデックスを作成するには、その後、型の列に参加する必要があり。 タイプと名前のフィールドに自動増分IDと一意制約を持つテーブルを持つことができます。次に、自動増分IDを外部キーとして使用するか、1つの列(タイプ)を持つタイプテーブルを作成します。これは主キーです。いずれにしてもうまくいくでしょうし、どちらも利点があります(コードで作業するのに柔軟性があると思うので、私は自動インクリメントカラムを使います)。あなたが自動インクリメントカラムを用いて行ったのならば

あなたはこれを持っていると思います:

CREATE TABLE dataType (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
name VARCHAR(64) UNIQUE 
) 



ALTER TABLE dataDB ADD COLUMN `type` INT; 
ALTER TABLE dataDB ADD CONSTRAINT fk_type FOREIGN KEY (type) REFERENCES dataType(id); 

を、あなたはあなたが(整数ではなく)タイプ名をしたい場合はどうしたらdataDBを照会するために行くときこれは、彼らはすべてちょうどint型の値データ型テーブルのカラムだけ作るに沿って、整数であれば、しかしそもそも整数をタイプが名前のいくつかの一種であると仮定しない

SELECT dataDB.list, dataType.name FROM dataDB 
INNER JOIN dataType ON dataDB.type=dataType.id 
where dataDB.type="$type" 

ので、それは次のようになります。このように参加主キー。

+1

これは、いくつの種類があるかによって異なります。 100個のデータタプルに対して5つの型を取得した場合、インデックスは20%未満の選択性しか持たないため、インデックスは使用されません。しかし私はあなたの答えに同意します。 2番目のバージョンを使用し、typeDBテーブルに参加してください。 – Basti

+0

'datatType ON'指定の中に' dataDB.type = "$ type" 'を含めて、結合された行を制限するという点で、私は1つの変更を行います。現在、' dataType' 'dataType'のサブセットのみが要求された場合でも、' dataDB'に出力します。小さなテーブルの場合は考慮しませんが、テーブルが成長する場合は良い方法です。 –

+0

hmm面白いキャッチ。私は、ON節とWHERE節の間に余分な条件を置くことの違いが何であるかは分かりませんでした。 –

関連する問題