关于大数据量查询导致的database的效率问题(只给最佳答案50分)

michaellufhl 2010-08-16 08:31:14
数据库中存有大量日志数据,程序界面提供各种查询条件的查询。(譬如日期查询+日志级别查询+....)
但是数据量相当大,一执行SQL语句就会花费很长时间。
请问有何良策?或者可以从算法角度来解决。

索引,和做stored procedure都试过,但是效果不好。
...全文
181 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
jjyz31 2010-08-18
  • 打赏
  • 举报
回复
学习了。。
yutaoice 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 michaellufhl 的回复:]
感觉分区是个很好的答案。
根据时间分区?
[/Quote]
千万不要按时间做分区,宁可用level分区,分区数量少没关系,如果你有5个level,50万的总数据量,平均每个分区下就只有10W数据了,表分区跟分表是一样的,两个数据量稍小的表关联查询,绝对比一个数据量稍大的单表查询速度还慢(sql优化程度相当的情况下)
yutaoice 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bao110908 的回复:]
说实在,很讨厌这种问数据库问题,连用什么数据库都不说,更可恨的是表结构也没有,就是三两句话让别人来优化!

日志级别就那么几种,创建普通 B-Tree 没有任何用处,可以试着创建位图索引。

日期的话,由于没有结构、用的什么数据库也不知道,无能为力!
[/Quote]

看sql语句还看不出来是mysql数据库,只能说你数据库水平一般了,要不然就是没接触过mysql
yutaoice 2010-08-17
  • 打赏
  • 举报
回复
把(date BETWEEN '2010-1-1' AND '2010-2-2')去掉试试,效率应该高很多,如果是这条语句导致的执行速度慢,那就换成date >= '2010-1-1' and date <= '2010-2-2'
还有办法就是加表分区,但是要注意表分区不能加在date字段上,按你的sql应该加在level上。
行舟 2010-08-17
  • 打赏
  • 举报
回复
分区了
或者按天分表了
youandi79 2010-08-17
  • 打赏
  • 举报
回复
google 一下
oracle partition table
kala197 2010-08-17
  • 打赏
  • 举报
回复
分库 也就是把业务和日志分开在两个数据库里面
在数据库里面建立分区
在页面上建立缓存
用存储过程
读写分离 把查询的房子一个服务器上 数据插入、修改放到另一个服务器上
kaida_7 2010-08-17
  • 打赏
  • 举报
回复
把添加日志记录和查询记录分为两个数据库,然后在某一个时间段再给予同步,日志记录分库,分表存储(库名,表明按照一定的规律建立,建议一张表存储最多几百万条记录就比较合适了);这样应该能提高查询速度。。。当然,还有就是提高硬件性能了,呵呵。。。
临远 2010-08-17
  • 打赏
  • 举报
回复
水平分表
全文检索
NoSQL
michaellufhl 2010-08-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bao110908 的回复:]

说实在,很讨厌这种问数据库问题,...就是三两句话让别人来优化!

...无能为力!
[/Quote]您的回复里面的惊叹号太多了:)
  • 打赏
  • 举报
回复
说实在,很讨厌这种问数据库问题,连用什么数据库都不说,更可恨的是表结构也没有,就是三两句话让别人来优化!

日志级别就那么几种,创建普通 B-Tree 没有任何用处,可以试着创建位图索引。

日期的话,由于没有结构、用的什么数据库也不知道,无能为力!
michaellufhl 2010-08-17
  • 打赏
  • 举报
回复
感觉分区是个很好的答案。
根据时间分区?
Thinking_In_IT 2010-08-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 michaellufhl 的回复:]
数据库中存有大量日志数据,程序界面提供各种查询条件的查询。(譬如日期查询+日志级别查询+....)
但是数据量相当大,一执行SQL语句就会花费很长时间。
请问有何良策?或者可以从算法角度来解决。

加索引,和做stored procedure都试过,但是效果不好。
[/Quote]

1)+索引是必须的l(level字段,和date字段)

2)SQL 语句改为:SELECT 字段1,字段2…… FROM log WHERE level=1 AND (date BETWEEN '2010-

1-1' AND '2010-2-2')

3)把log表 分区

4)缓存部分离线数据,页面上不可能一次就显示几千万条数据吧?
  • 打赏
  • 举报
回复
1.视图试了么。
2.使用定时器后台执行生成需要的数据为临时表,(不知道你查询出来要干什么)。
michaellufhl 2010-08-16
  • 打赏
  • 举报
回复
或者说这个table叫log,有上千万条记录。
SQL语句是:
SELECT * FROM log WHERE level=1 AND (date BETWEEN '2010-1-1' AND '2010-2-2')
michaellufhl 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xuhuanchao 的回复:]

优化SQL语句试试
[/Quote]本身SQL语句不复杂。
水中影子 2010-08-16
  • 打赏
  • 举报
回复
优化SQL语句试试

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧