4

かなり大きなデータベース、100 以上のテーブルがあります。データベースの設計は、従来のリレーショナル データベースです。外部キーに関連付けられたテーブルに主キーがあります。ただし、実際の mysql dba には関係を設定していません。PHP を使用して Web サイトのデータにアクセスします。すべてのクエリは、ON が主キー = 外部キーに設定された結合ステートメントによってテーブルを結合します。関係についての知識はすべて私の頭の中にあり、非常に単純な命名規則を使用しているという事実です。すべての主キーは、末尾に PK が付いたテーブル名 (tablenamePK など) であり、すべての外部キーは末尾に ID が付いた tablename です (tablenameID など)。PHP を実行するための SQL を作成するときに、何が主キーで何が外部キーであるかを確認するのは非常に簡単です。そうは言っても、私は' MySQL DBA で実際にこれらの関係を作成する必要があるかどうかを議論していました。そうすることでパフォーマンスが向上しますか? 最近までパフォーマンスはそれほど問題ではありませんでしたが、今はハードウェアのアップグレードを検討する前に、できるだけ多くの効率を上げたいと考えています。

4

1 に答える 1

3

外部キーは、「FK」列に通常のインデックスを作成することによって実行できないパフォーマンスの向上はありません。つまり、パフォーマンスのために必ずしも制約が必要なわけではありません。

外部キー制約は、データの異常を防ぐためのものです。


あなたのコメントについて:

そうです、インデックスは、PRIMARY KEY、UNIQUE KEY、または FOREIGN KEY 制約が与えられた列に対して暗黙的に作成されます。

インデックスが利益をもたらすかどうかは、テーブルとは何の関係もありません。また、他のテーブルを参照する列がある場合でも関係ありません。実行するクエリに関係しています。

例えば:

CREATE TABLE Departments (ID INT PRIMARY KEY, name VARCHAR(10));

CREATE TABLE Employees (ID INT PRIMARY KEY, name VARCHAR(10), DeptID INT NOT NULL);

これらのテーブルは明らかに関連していますが、インデックスまたは外部キー制約は定義されていません。

Employees.DeptID のインデックスは、トレーニング部門のすべてのメンバーを返すために、このクエリに役立ちます。クエリは、最初に部門を名前で検索し、次にインデックスを使用して対応する従業員を検索します。

SELECT ... FROM Departments d JOIN Employees e ON d.ID = e.DeptID  
WHERE d.name = 'training';

しかし、そのインデックスは、特定の従業員の部署名を返すこのクエリに対しては何もしません。クエリは、最初に従業員を名前で検索し、次にそれを使用して、対応する部門を主キー ID で検索します。

SELECT ... FROM Departments d JOIN Employees e ON d.ID = e.DeptID  
WHERE e.name = 'Bill';
于 2013-03-18T20:22:54.690 に答える