0

このようなテーブルがあります

Subscribers
  Id (PK, int)
  OwnedBy (FK, int)
  EmailAddress (varchar 50)

次のようにクエリすると:

SELECT COUNT(DISTINCT(EmailAddress))
FROM Subscribers
WHERE Subscribers.OwnedBy = 67;

列にインデックスがありOwnedByます。テーブルが非常に大きいと仮定すると、インデックスも作成する必要がありますEmailAddressか? 書き込み性能の低下は気になりません。

4

2 に答える 2

1

さらに高速化するには、カバリング インデックスを作成する必要があります。

ALTER TABLE Subscribers ADD KET ix1(OwnedBy, EmailAddress);

次のクエリで Using where Using Index の状態を確認します。

EXPLAIN SELECT COUNT(DISTINCT(EmailAddress))
FROM Subscribers
WHERE Subscribers.OwnedBy = 67;
于 2012-07-20T08:02:09.767 に答える
1

はい、そうすべきです。

クエリは次のように書き直すことができるため:

SELECT COUNT(*)
FROM Subscribers
WHERE Subscribers.OwnedBy = 67
GROUP BY EmailAddress

MySQL のGROUP BYパフォーマンス最適化ページをご覧ください。

http://dev.mysql.com/doc/refman/5.0/en/group-by-optimization.html

そこでは、次のように述べられています。

The most efficient way to process GROUP BY is when an index is used to 
directly retrieve the grouping columns

したがって、挿入/更新のパフォーマンスとテーブルのサイズを気にしない場合は、間違いなくインデックスを使用する必要がありますEmailAddress

于 2012-07-20T08:12:16.580 に答える