2011-09-10 45 views
0

私はMySQLでの2つのテーブルを持って、それらの間のMySQLの最適化

Table_A { pk_A VARCHAR 150 PRIMARY KEY, random_data } ~ 9500 rows 
Table_B { pk_B VARCHAR 150, more_random_data } ~ 50000 rows 

の関係は1対多、PK_AはコルPK_BにTable_Bで複数回検出されますです。

私の問題は、次のとおりです。

  • 私はPK_Bにインデックス付けを有効にした場合、PHPは/ MySQLのCRUDが正常に動作しますが、JOINまたは両方のテーブルを含むコマンドラインから他の任意のクエリは、長い時間を要する

  • 私はPK_Bにインデックス付けを無効にした場合、PHP/MySQLのCRUDはlaggishになりますが、両方のテーブルを含むコマンドラインからJOINまたは他の任意のクエリは、瞬時

どのようです私は私のデータベースのパフォーマンスを向上させる(私はintにvarchar型からの私のPKのを修正することができる(11))が、

おかげ

+1

なぜvarcharを主キーとして使用していますか? –

+0

どのようにテーブルに参加していますか? PKは常に索引付けされる必要があり、高速な結合のために外部キー列も索引付けする必要があります。 – bfavaretto

+0

使用されているエンジンは何ですか? MyISAMとInnoDBのパフォーマンスに関する考慮事項は異なります。 – SingleNegationElimination

答えて

2

クエリをスピードアップするためにいくつか利用可能な他の回避策がある場合、私は疑問に思いました。多くのコメントが示唆するように、あなたは常にプライマリキーを妥当である限り小さく保つ必要があります。短い文字列、たとえばVARCHAR(10)は、それほど大きな痛みを引き起こすことはありませんが、それよりもはるかに大きい場合は、代理キーを使用することができます。これは、ナチュラルキーをユニークにすることで、プライマリキーではなく、多かれ少なかれトランスペアレントにすることができます。

Table_A {PK_A VARCHAR 150 PRIMARY KEY、random_data}〜9500行 Table_B {PK_B VARCHAR 150、more_random_data}〜50000行

おそらく、このようなビットになりますあなたのスキーマ:

CREATE TABLE `Table_A` (
    `id` INTEGER AUTO_INCREMENT PRIMARY KEY, 
    `A_name` VARCHAR(150) UNIQUE NOT NULL, 
    -- other columns 
) ENGINE = InnoDB; 

CREATE TABLE `Table_B` (
    `id` INTEGER AUTO_INCREMENT PRIMARY KEY, 
    `B_name` VARCHAR(150) UNIQUE NOT NULL, 
    `A_id` INTEGER REFERENCES `Table_A`(`id`), 
    -- other columns 
) ENGINE = InnoDB; 
+0

ソリューションが動作し、クエリ時間がテストされただけで素晴らしいことです! –