インデックス付きビューを作成して、Web ページで実行している一連の SELECT count(DISTINCT id) クエリのパフォーマンスを向上させようとしています。現在、これらのクエリの実行には約 9 秒かかります (クエリは約 14 あり、すべて非常に似ています)。クエリを実行しているテーブルには 710 万件のレコードがあります。
基本的に、選択しようとしている「iPhone」や「Android」などのキーワードを持つ長い文字列 (UserAgents) を含む列を持つテーブルがあります。以前は、WHERE useragent LIKE '%iPhone%' を使用して、useragent から "iPhone" を抽出していました。LIKE ワイルドカードは計算コストが高いことを知っていたので、これを行い、たとえば "iPhone" を整数値に割り当てるビューを作成したので、たとえば WHERE useragent = 2 などのビューに対して選択できるようになりました。ビューにインデックスを付けましたが、これらのクエリのパフォーマンスは向上しません。
クエリの 1 つの例を次に示します。
SELECT COUNT(DISTINCT message_id) AS Amount
FROM emailClientUsageView
WHERE HTMLID = 4736 AND (EC = 8 AND UA != 2 AND UA != 3);
テーブル、ビュー、データベース、および/またはクエリを最適化して、これらのクエリを妥当な時間 (< 2 秒) で実行するにはどうすればよいですか?
編集: 表: 列: id、htmlid、msgid、dt、UserAgent、Referrer、EmailClient
テーブルに追加されたインデックス: UserAgent の一意のクラスター化インデックス、EmailClient の id 非一意の非クラスター化インデックス
意見:
SELECT id, msgid, HTMLID,
CASE
WHEN Referrer LIKE '%aol%' THEN 1
WHEN Referrer = '' THEN 99
ELSE 0
END AS ref,
CASE
WHEN UserAgent LIKE '%iPhone%' THEN 1
WHEN UserAgent LIKE '%iPad%' THEN 2
WHEN UserAgent LIKE '%iPod%' THEN 3
WHEN UserAgent LIKE '%Microsoft Office%' THEN 4
WHEN UserAgent LIKE '%Mozilla%' THEN 5
WHEN UserAgent LIKE '%Android%' THEN 6
ELSE 0
END AS UA,
CASE
WHEN EmailClient LIKE '%iPhone%' THEN 1
WHEN EmailClient LIKE 'internet explorer%' THEN 2
WHEN EmailClient LIKE '%Outlook%' THEN 3
WHEN EmailClient LIKE '%yahoo%' THEN 4
WHEN EmailClient LIKE '%safari%' THEN 5
WHEN EmailClient LIKE '%Android%' THEN 6
WHEN EmailClient LIKE '%gmail%' THEN 7
WHEN EmailClient LIKE '%Windows%' THEN 8
WHEN EmailClient LIKE '%AOL%' THEN 9
WHEN EmailClient LIKE '%Thunderbird%' THEN 10
WHEN EmailClient LIKE '%Lotus Notes%' THEN 11
WHEN EmailClient LIKE '%Palm%' THEN 12
WHEN EmailClient LIKE '%Entourage%' THEN 13
WHEN EmailClient LIKE '' THEN 99
ELSE 0
END AS EC
FROM store_openEmail AS emailClientUsageView
ビューのインデックス: ID でクラスター化された一意、EmailClient でクラスター化されていない非一意