2012-02-20 9 views
1

申し訳ありません。ここに私の問題がある。私は数値の値を持つテーブル(Pythonで)を持っています(例えば、{3:1,3:2,3:3})。私はこの変数の永続ストレージとしてデータベースを使用したいのですが(メモリに完全に収まらないので)、できるだけ速くしようとします。2つの列を互いにユニークにすることはできますか?

現在、私はmysqlで1つのカラム(インデックス付き)を使用しており、辞書の各エントリは独自の行を取得しています。私はCHARカラムではなくINTの2つのカラムを使用すると読み書きを高速化できるかどうかを調べたいと思っていましたが、どちらのカラムも互いにユニークである必要があります。上記の例では、すべてのデータが一意であり、別の3 = 1を追加すると、既存の値が上書きされますが、3 = 4は新しいエントリを作成します。どうすればmysqlでそれを複製できますか?

スピードアップについての私の論理は理にかなっていますか、2つの列の選択は実際に1つの列よりも高価になりますか?

私はこれを最初から構築していますので、既存のソリューションで作業する必要はありません。私は非常に柔軟なアプローチをとることができます。

ありがとうございます!

+1

複合主キーをお探しですか? – Asdfg

+0

私は、 'varchar'を2つの' ints'に分割することを提案します...パフォーマンス上の理由ではなく[適切な正規化](http://en.wikipedia.org/wiki/Database_normalization)。まず、動作させる - 2番目に、それを正しくする - 最後に、それを速くすることを心配してください。 –

+0

@Asdfg私はそう思う、今は私は1つの列しかないので、私はそれを分割できるかどうかを見たいと思う。 @マイケル私はそれをショットしようとしています。今は既に動作していますが、mysqlの方が速いので、別のアプローチをテストして、以前の結果と比較してベンチマークしています(結果が同じであることを確認してください)。 – Lostsoul

答えて

4

ショートバージョンを使用すると、テーブルの上TESTTABLE名uniqueOnCol1AndCol2でカラムを追加する一意のインデックス

// Create the test table 
CREATE TABLE testTable (
    col1 INT UNSIGNED NOT NULL, 
    col2 INT UNSIGNED NOT NULL, 
    col3 VARCHAR NOT NULL, 
    PRIMARY KEY (col1,col2) 
); 

で複数の列を持つことができるということです。次に、INSERTクエリを次のように使用できます。

INSERT INTO testTable (
    col1, 
    col2, 
    col3 
) VALUES (
    3, 
    1, 
    'Original value' 
) ON DUPLICATE KEY UPDATE 
col1 = VALUES(col1) 

これは、(3,1、 'Original value')をtestTableに挿入することになります。

INSERT INTO testTable (
    col1, 
    col2, 
    col3 
) VALUES (
    3, 
    1, 
    'New value' 
) ON DUPLICATE KEY UPDATE 
col1 = VALUES(col1) 

のフォローアップ後、COL3上書きし、ユニークな列のペアを作ってそれ「新しい価値」

+0

驚くべきことに、ありがとうございました。 – Lostsoul

+0

申し訳ありませんが、少し問題があります。実際には3列目は必要ありませんでした。あなたが持っている最初の2つだけ(私は行ごとに数字のセットを持っています)。あなたが上記のコマンドでそれらの2つのセットを追加しようとすると3,1で動作しますが、3,2を追加しようとすると、col1に対して重複した主キーエラーが発生します。理にかなっていますが、col1とcol2の両方をプライマリキーのジョイントタイプとして使用する方法がありますか? – Lostsoul

+0

私は例を更新しました - 私はPKについて忘れてしまったので、PKをcol1、col2に変更しました - 重複するcol1、col2の組み合わせを防止する目的で同じ機能を果たします、col3は必要ありません –

2

になるだろう、あなたは両方の列に一意のインデックスを宣言します。このような 何か:

create unique index myindex on mytable(col1, col2)

1

使用UNIQUE両方列に対する制約とREPLACEの代わりINSERTを使用しています。あなたが話しているパフォーマンスのメリットとvarcharはどこから来たのか分かりません。

関連する問題