论坛首页 综合技术论坛

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

浏览 26217 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-08-14  
其实顶楼的sql,只是一个基准的sql,查找某种审核状态下的所有blog记录。而在这个基准sql上,可能会有更多的条件。例如我在之前提到,title搜索,或者对user属性的搜索。

这个问题我也很烦恼。因为最小的时间范围内——7天,也有大概9-20w的数据。
0 请登录后投票
   发表时间:2008-08-14  
eason007 写道
最后弱弱的问一句,现在这种情况真的只有数据库配置调优的方法?

不是已经告诉你,问题是不要导致大批量的数据读取,比如,前面的语句,假如没有title条件,并且有limit,那肯定执行飞快。
如果有title条件,但是索引是对createtime起作用,那么mysql读取出十万的数据,然后再剔除掉不要的记录,即使有limit,也起不到作用,仍然导致10万的数据读取。
问题在于索引没用到刀刃上。工具就是善用explain。
0 请登录后投票
   发表时间:2008-08-14  
但问题是需求如此,没有什么更好的办法去绕过。

能不能介绍一些优化配置的方法?
0 请登录后投票
   发表时间:2008-08-14  
不明白你说:“需求如此,有什么办法绕过去”的意思。
你可能还没明白我的意思:
select * from blog as b where b.createTime < ? and b.createTime > ? and title like 'abc%' limit 0,20。
假如使用的索引是createTime,命中记录很多,而且又需要继续做like,发挥不出limit的作用,效果不好。
title索引命中的记录少,那便。
优先使用title上的索引,select * from blog as b use index (blog_title_idx) where b.createTime < ? and b.createTime > ? and title like 'abc%' limit 0,20。
主要就是让索引命中的记录数量足够小,并且能发挥limit的作用。
0 请登录后投票
   发表时间:2008-08-14  
yy一个变通的方法。搞几台机器,作为镜像库,将查询都发送给这些库,这些库用内存当硬盘用。
0 请登录后投票
   发表时间:2008-08-14  
把20w的数据全部取出来,时间无论如何都短不了!

如果数据量大,要想快:1.竭尽所能避免表扫描;2.竭尽所能取最少的数据。
0 请登录后投票
   发表时间:2008-08-15  
全文检索的需求吧,用like怎么优化都没用。

貌似mysql的中文全文检索支持度不高,不过也可以试试。

单独使用全文检索引擎也是不错的选择,比如lucene。
0 请登录后投票
   发表时间:2008-08-15  
引用

最终的SQL为:

FROM blog AS m INNER JOIN user as s ON m.userID = s.ID WHERE m.manager = 2 AND m.createTime >= ? AND m.createTime <= ? ORDER BY m.ID DESC LIMIT 0,20


分成两步查询,避免 JOIN,最后来组装数据。

第一步:查询 blog 表

SELECT ... FROM blog AS m 
WHERE m.manager = 2 AND m.createTime >= ? AND m.createTime <= ? 
ORDER BY m.ID DESC 
LIMIT 0,20


因为第一步查询的结果只有 20 条记录,所以可以把这 20 条记录的 blog.userID 够造成一个字符串,例如:

245, 533, 6234, 35353 ....



第二步:查询 user 表

SELECT ... FROM user AS s
WHERE s.ID IN (245, 533, 6234, 35353 ....)


这里虽然用了 IN (),但 IN () 里面是一个常量表达式,所以效率没有问题。


第三步:组装数据

把从 user 查询出来的数据和从 blog 查询出来的数据组装起来。
0 请登录后投票
   发表时间:2008-08-16  
看了半天,感觉lz表达的还是不清楚

1.到底哪些东西需要从user表里面查询出来?
2.这个查询的用途是什么?是查询出blog的内容?还是内容+所有用户信息?还是内容+部分用户信息
3.查询从外部带来了哪些限定参数?比如uid?title?。。。

对于频繁的操作,不建议用join,把必要的数据重复,放到blog表中为好,这是考虑性能。

0 请登录后投票
   发表时间:2008-08-17  
对20万数据排序非常耗时,建议将聚集索引使用ID倒序
0 请登录后投票
论坛首页 综合技术版

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