1

invitationsデータベースにテーブルがあり、テーブルの列の外部キーであるfromと列があります。touserIdusers

たとえば、ユーザー#1がユーザー#2に何かをするように招待した場合、invitationsテーブルでfromは1になり、to2になります。

to次のようなwhereステートメントで列を使用します。

SELECT * FROM invitations WHERE `to` = $currentUserId

ただし、このfrom列がWHEREステートメントで使用されることはありません。

私が読んだことから、WHEREステートメントで使用される列にのみインデックスを追加する必要がありますが、常に外部キーを作成する必要があることも読みました。

from外部キーを追加するためだけにインデックスを作成することは意味がありますか?

4

2 に答える 2

2

外部キーの場合は、ユーザーとのやりとりに応じて追加する必要があります。

内部的には、fkeyは、招待状の挿入/更新/削除だけでなく、users(id)の更新/削除に対してもアクションを実行します。

これらの最初のものは、users(id)のインデックスを使用して、ユーザーが存在するかどうかを確認します。

もう1つは、基本的に次のクエリを実行しますdo whatever you defined to do on update/delete from invitations where to/from = :id

したがって、ユーザーのIDを変更した場合(ほとんどありません)、インデックスを利用できます。また、ユーザーをときどき削除する場合(ほんの少しだけ可能性が高い)、インデックスを利用できます。

また、他の回答で指摘されているように、インデックスは、order by/limit句を使用したクエリにも役立ちます。

于 2011-05-21T16:10:55.220 に答える
1

WHEREステートメントで使用される列にのみインデックスを追加する必要があります

それはそれほどカットされて乾燥していません。これは大まかな目安ですが、これだけではありません。

また、頻繁に、そして常に注文する列にインデックスを付け、変更の前後に常にテストして、パフォーマンスが向上したかどうかを確認する必要があります。

一般に、外部キーは、where / order by句の一部でない限り、インデックスを定義してもメリットはありません。そうである場合は、インデックスを作成する必要があります。(ここでも、経験則)。

これは、MySQLを最適化するための優れたリソースのように見えます。インデックス作成について説明している下部を見てください。

于 2011-05-21T16:08:33.460 に答える