2016-08-11 8 views
1

id(自動インクリメント)をMySQLの主キーの2番目の列として使用できますか?下記の表orderを参照してください。MySQLの主キーの2番目の列にID(自動インクリメント)を持たせることはできますか?

私の考えは、MySQLは、主キーインデックス(CUSTOMER_ID、ID)を介してordersにアクセスすることが、私はcustomer_id .Thanks

Customer 
+-------------+ 
| id (autoinc)| --> primary key 
|- - - - - - -| 
| name  | 
| address  | 
+-------------+ 
     | 
     | 
     | 
     A 
    Order  
+------------------+   
| customer_id (fk) | --- primary key 
| id  (autoinc) | --- primary key   
|- - - - - - - - - | 
| date    | 
+------------------+ 
+0

テーブルのために使用されるデータベースエンジンに依存して、InnoDBのようなものでは、レコードを密接に保存するのに役立ちますが、それは私にとっては(時期尚早な)最適化のように聞こえます。あなたは 'いつ、id'のPKから恩恵を受ける可能性が高いのでしょうか(おそらく冗長と見なすことはできますが)。 – Uueerdo

+0

私はDB2で作業しましたが、ほとんどの場合、パフォーマンスのために上記の 'order'テーブルのように、' customer_id'だけで注文テーブルを照会するので、99%の時間がかかります。しかしもちろん、これは大きなボリュームとの違いになります。私はMySQLがそれとは違うか、それとも自動的に 'customer_id'の外部キーのインデックスを作成するのでしょうか? – user3489502

+0

ええ、すべてのFKフィールドは、関係の両側で索引付け(または索引を開始)する必要があります。 – Uueerdo

答えて

0

gr1zzly be4rからの回答のビル...

InnoDBは、実際にあなたが任意のキーの最初の列、必ずしも単なるUNIQUE KEYとしてオートインクリメントを使用することができます。

CREATE TABLE `your_table` (
    `a` int(11) NOT NULL, 
    `b` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`a`,`b`), 
    KEY `b` (`b`) 
) ENGINE=InnoDB; 

INSERT INTO your_table (a) VALUES (42), (43); 
SELECT * FROM your_table; 
+----+---+ 
| a | b | 
+----+---+ 
| 42 | 1 | 
| 43 | 2 | 
+----+---+ 

つまり、bの列は必ずしも一意である必要はありません。

1

orderテーブルを照会するときは、でこれを行うことができます速くなるだろうということですテーブルの構文に従っていますが、実際にどのようなパフォーマンス上の利点が得られるのかは分かりません。私はそれを見て、私の答えを更新します。

CREATE TABLE your_table (a INT NOT NULL, b INT NOT NULL AUTO_INCREMENT UNIQUE); 
ALTER TABLE your_table ADD PRIMARY KEY (a, b); 

ただし、UNIQUEキーをbにドロップすることはできません。

+0

ありがとう@ gr1zzlybe4r、MySQL(InnoDB)がorderテーブルの 'customer_id'の上にある外部キーのインデックスと' id'自動インクリメントカラムの別のインデックスを自動的に作成するのは可能でしょうか?そのような場合(2つのインデックスを持つ、各列に1つ)は、両方の列( 'customer_id、id')を持つ1つのインデックスとほぼ同じです(パフォーマンスが向上します)。 – user3489502

+0

@ user3489502では、単一のインデックスを使用するとクエリのパフォーマンスが大幅に向上します。技術的には、MySQLは同じテーブルの2つのインデックスを使用するための「インデックスマージ」最適化機能を備えていますが、私の経験ではうまく機能しません。 –

+0

@BillKarwin、情報をありがとう。したがって、2つのインデックスでは、MySQLがテーブルに書き込むときに挿入時にパフォーマンスの問題に気付き、さらに2つのインデックスも通知されます。またはselect on from select order * from order where customer_id = x; 'このクエリは外部キー' customer_id'に対して作成されたインデックスのみを使用しますか?ありがとう! – user3489502

関連する問題