我正在尝试通过创建索引视图来提高我在网页中运行的一堆 SELECT count(DISTINCT id) 查询的性能。目前,这些查询运行大约需要 9 秒(其中大约有 14 个,它们都非常相似)。我正在查询的表有 710 万条记录。
基本上,我有一个表,其中的列包含长字符串(UserAgents),其中包含我试图选择的关键字,如“iPhone”或“Android”。以前我使用 WHERE useragent LIKE '%iPhone%' 从用户代理中提取“iPhone”。知道 LIKE 通配符的计算成本很高,我创建了一个视图来执行此操作并将例如“iPhone”分配给一个整数值,所以现在我可以针对我的视图进行选择,例如 WHERE useragent = 2。哪个应该更快对吧?我什至为视图编制了索引,但这些查询的性能并没有提高。
以下是其中一个查询的示例:
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、Referer、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 上的非唯一非集群