23 ä¹, 2007
一个SQL查询的优化
对于查询 如果牵涉到排序 一个处理不好 对于效率的影响是非常之大的 ME目前正在进行的一个项目(没有好词语形容,只能用项目了,当然他的复杂程度完全称不上)中牵涉到一个热门文章的排序问题 目标是对点击数最高的前十条记录查询后输出
在万级以内的数据 (ACCESS) 根本没出现什么问题 然而当向数据里加入了50万条数据的时候就出现了问题 时间竟然达到五秒之多 当然这个时间也包括了分析模版的时间 这样慢的速度实在是让人无法忍受的
后来对查询进行了分析 原来ME使用的查询语句是
select top 10 id,title,hits from article order by hits desc (从语句里就能看出结构了,在此不再累述)
这样的查询是从整个记录(50万条)里按HITS进行倒序排列后输出前十条 . 这就无疑是非常耗费时间的
后来16老大 提醒了ME一HA 是不是可以先排除一些记录 后再重新进行排序 于是ME
将语句 改成了
select top 10 id,title,hits from article where hits>cint(select avg(hits) from article where hits<>0) order by hits desc
这HA 一HA 子将 时间 降至了 1.3 秒左右 这无疑也是很大的 改进 当然这有个非常大的问题 就是在进行前对 点击为零的数据进行了 排除 然后 到了后来 点击为 0 的 出现可能不大 所以速度 仍然是存在问题 也就是说 最坏的情况HA 就是 许多的都是1 而只有几个点击次数非常多 那么那个AVG 仍然 对于排除 不必要数据 没有什么多大的帮助 但虽然如此 在最好的情况HA 却前进了一步 也算是一个进步 至少他 给 大家 说明了一点 提高排序效率 的 一种方法 尽可能的去排除对于你的排序没有任何帮助 的 记录 哈哈 就记到此了
注明:以上讨论是在HITS建立索引的情况HA 另外象这种非聚族数据集加了索引影响并不算太大
一个SQL查询的优化