我的问题主要是:我怎么知道我的数据库做一个序列扫描和第一场比赛时,停止我的WHERE条件?
假设我想找到某种类型的第一个事件,我可以写下面的查询:
select *
from installs
where country = 'China'
order by install_date
limit 1
这里的问题是,根据操作顺序引擎会扫描所有的表格,并生成我的过滤器匹配的数据集,然后进行排序该数据集(拥有巨大的成本),然后只返回第一行。
我可以通过特定的日期当然过滤器,但让我们假设我不知道作为筛选依据的时期 - 如何优化这种类型的查询在亚马逊红移(where子句中的东西,也许)?
红移的一般策略是做了很多的扫描,但并行化。这包括获得一个单行无论如何是不会理想。这就是说,你可以做四两件事:
1.减少扫描,一个点
如果国家将永远领域过滤,先表的排序关键字设置为打开全国复合排序关键字。
2.消除排序的需要
一个更有效的方式做到ORDER BY x LIMIT 1
往往是MAX。
然后尝试
SELECT *
FROM installs
WHERE pk = (
SELECT MAX(pk) -- or install_date, if install date is unique
FROM installs
WHERE country = 'China'
)
3.裁缝行取向和柱状之间的选择的列
问一个柱状数据库像红移选择*退订,每列费用。尝试仅仅选择您需要的列。
4.添加更多的节点,所以每个节点确实少扫描
(确保数据没有被设置为分布样式的所有)
如果删除ORDER BY
,那么它可以有效地工作。
对结果进行排序的要求意味着需要检查的所有行的国家是中国,这是效率不高,返回一个项目。
所述where country = 'China'
子句是有效的,如果因为它可以SORTKEY = country
跳过不包含所期望的值的任何存储块。如果有匹配的非常相对较少的行。这将是高效的。
如果您经常查询一个行的结果,那么它可能是值得保存在单独的表这样的信息更快地查找。该值可以每天计算,或者每隔一小时,是必要的。