题目案例

淘宝 web 服务器上有 1 个 access 日志文件,记录着用户访问的 url,url 总数100 亿以上,每个 url 约占 64 字节,这些 url 可能存在重复,在一个内存只有 2G 的机器上,统计访问频率最高的前100 个 URL。

考察点 1:MapReduce 思想,利用中间文件存储,分而治之。
考察点 2:排序算法

解题思路:100 亿 *64/1024/1024/1024 = 596G, 可考虑分成 1000 个文件处理,每个文件大约 600M。顺序读取文件,每行按照 hash(url)%1000 的结果将 url 写入到 1000 个文件中,这个过程是 mapreduce 中的 map。
针对每个小文件,使用 hashmap 统计每个 url 出现的次数,并使用堆排序得到访问次数最高的前 100 个 url,将每个文件排序好的 100 个 url 及对应的 count 输出到 1000 个文件,最后将这个1000 个文件(此时每个文件只有 100 行 ) 进行合并排序

索引题目案例

有如下表:
create table t(a int, b int, c int);
已知如下三条是这个表最常用的三条 query:
select * from t where a = 1 and b = 1;
select * from t where b = 1;
select * from t where b = 1 order by c desc;
以下索引哪个是最优的:
A. idx(a, b)
B. idx(b, a)
C. idx(b, c)
D. idx(a, b, c)

答案是 B

最左匹配原则:等值的条件去命中索引最左边的一个字段,然后依次从左往右命中,范围条件放在最后面
建立联合索引:index(a,b,c) 相当于建立了index(a)、index(a,b)、index(a,b,c)三个索引

搜索条件没有按照联合索引的顺序,也使用了联合索引:这是因为MySQL中有查询优化器explain


应该将搜索条件范围最小的条件放在最左边,这样在SQL执行的过程中将结果集优先缩小。