论坛首页 综合技术论坛

mysql5下大数据量查询优化的问题

浏览 26227 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-08-29  
当然,日后也是打算上Lucene的了,只是还没纳入现在的开发计划中,因此只好辛苦一下了。:(
0 请登录后投票
   发表时间:2008-08-31  
你要搜title,不用lucene是解决不了问题的. 21s就能出来结果我感觉很惊讶.
如果你非不用, 那可能还是要改改需求. 比如, 不用like, 把blog归纳为既定的几个tag里, 然后对tag搜索?
0 请登录后投票
   发表时间:2008-09-01  
数据库优化是一门高深的学问啊。
0 请登录后投票
   发表时间:2008-09-01  
jacklondon 写道
正常情况下,blog 表数据应该超过 user 表 n 多。
按照专业术语讲,user 表是 master 表, blog 表是 transaction 表。
Transaction 表指的是数据量虽时间成正比增长的表,这里 blog 肯定是。
至于 user 表,按道理不会有 2000w 的数据量。能否把 user 表的表结构给大家看看?
2000w 什么概念?中国全部网名的数量,也许还没有这么多。全中国的网站,自互联网开始,到现在有 2000w 注册用户的网站也不多。
顺便说一句,如果你的网站有 2000w 注册用户,随随便便都能卖上个好价钱,几辈子都花不完。


正常情况就是user表比blog表大n多。或许你参加的都是些比较专业性的网站,或者是bsp。但我们现在的不是,blog只是众多服务中的一种。有很多用户来我们网站注册并不是为了写blog,而是其他服务。

2000w用户不是很多吧,那些csdn、网易之类都不至这个数的多少倍了。能做得出名点的网站都是一堆无用的注册用户,我们网站也不可避免。

当然我们现在也卖了个相对好一点的价钱,以最近一轮融资来算的话,大概一个用户卖一美刀,最近正在做上市前的最后审计。。。
0 请登录后投票
   发表时间:2008-09-01  
jacklondon 写道
如果没有用到全文索引,那么查询肯定要用 where createTime > ? and  createTime < ? and blog_text like '%?%' order by createTime desc, id desc;
数据库排序,肯定先要按照用户能够看到的字段排序,不然用户就会觉得你根本没有排序!因为从他看到的页面数据里,他看不出来你的排序规则,只有你自己心知肚明,这样很不好。

楼主写的 SQL: FROM blog AS m INNER JOIN user as s ON m.userID = s.ID WHERE m.manager = 2 ORDER BY m.ID DESC
这基本上是进行全表扫描了,既然你的 where 中什么数据过滤条件都没有,加不加索引都是一样慢。难道在 manager 字段上加索引?也不可能。

数据量上讲 blog表 200w,user表 3000w, 平均每 15 个用户对应一个 blog,呵呵,怎么看都有问题。
用户分两种,一种是要写 blog 的,一种是不写 blog 的。
不写 blog 的用户很多,但是这些人是不会去注册成正式用户的。
登记成用户的,一般都会写一两个 blog, 否则登记做什么?这样 user 数量应该大于 blog 数量。




我说了,按ID排序就是按时间排序,用户体验也是感觉按时间排序的。这个没任何问题。是你理解不清楚。
0 请登录后投票
   发表时间:2008-09-09  
查询优化还是数据库优化 ?

当你在数据库这一层做了该做的优化,该索引的索引,该干吗的干吗之后

可以在查询方式上做些策略:象这种大数据量的查询,短时间是出不了结果的
数据超过500万以上的,去关连,那恐怖

如果只是要求出结果方案很多的,比如一张5000万的表数据,再相关一另一张表数据

mysql 可以 ordery id limit 10000 再一条条去抓取另一张表的相关记录
分开查比一次50万 500万中取结果集 快很多,而且一直听说mysql自己的游标有问题

可以自己模拟游标形式去操作,5000万条记录,每次抓取1万条 到最后一次抓取小于1万,结束

0 请登录后投票
   发表时间:2008-09-09  
俺是统计组的
0 请登录后投票
   发表时间:2008-09-09  
def getDataFromDB={
new File((debug==0?remote:local)).withWriterAppend{
wwa->
def all=0,p=0,maxid=1022470056;
while (true){
def runSql=mainSql+" id>"+maxid+selectTime+" order by id limit "+limit;
println runSql
p=0;
thisdb.eachRow(runSql){
  w->
  p++;all++;
  String result=w.username
  if(!usernameMap.containsKey(result) ){
    usernameMap.put(result,0)
  wwa.writeLine(result+",") ;
    if(result.indexOf("@188")!=-1 || result.indexOf("@yeah")!=-1 || result.indexOf("@126")!=-1 || result.endsWith(".popo") || result.endsWith(".vip")  )
           new File((debug==0?"/home/mine/scripts/txt/pxh/通行证.txt":"D:/通行证.txt")).withWriterAppend{t1-> t1.writeLine(result)  }
    else
       new File((debug==0?"/home/mine/scripts/txt/pxh/非通行证.txt":"D:/非通行证.txt")).withWriterAppend{t2-> t2.writeLine(result)}
  }
 
  maxid=w.id
  }
if(p<limit)
break;
}//-end while
}
}
0 请登录后投票
   发表时间:2009-01-06  
试一下分表查
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics