1.mysql join/order by/group:
Join 的时候最好选择小结果集驱动大结果集
Join 语句中的被驱动表的join条件最好加上索引
Join buffer 大小的设置
Order by 假如是根据有序索引直接获取有序数据 不用进行任何排序操作
无索引时候可以将排序字段和定位它所对应的行索引 排序后再去数据库中取需要的那些字段或者是一次性将所有需要的字段先放到内存中 排序后再到内存中取其他数据
假如order by 只涉及一张表 假如此表又是驱动表 那会先排序再做join 假如排序字段不在两张表中或者需要经过join 后才能做 此时需要先存储到临时表再排序
Group by 使用松散或者紧凑索引 临时表实现
2.lucene查询:
先到词典tis中获取评分需要的相关数据 比如tf,docFreq信息后,将query经过语法分析后的term和doc计算相似度。计算的时候先去词典中 查找包含的term的doc信息。然后再计算。但是这个时候计算的结果也要常驻于内存中,所以当这些中间计算结果很大的时候,是不太合适的。
lucene使用并发合并和块处理来加快相似度的计算:并发合并是将每个term对应的doc排好序,,然后依此取出每个term的第一个doc,将大的doc去掉后组成一个队列,计算该队列的相似度;块处理就是将文档id有序的分块(mlogn)