锁定老帖子 主题:mysql5下大数据量查询优化的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-08-14
其实顶楼的sql,只是一个基准的sql,查找某种审核状态下的所有blog记录。而在这个基准sql上,可能会有更多的条件。例如我在之前提到,title搜索,或者对user属性的搜索。
这个问题我也很烦恼。因为最小的时间范围内——7天,也有大概9-20w的数据。 |
|
返回顶楼 | |
发表时间:2008-08-14
eason007 写道 最后弱弱的问一句,现在这种情况真的只有数据库配置调优的方法?
不是已经告诉你,问题是不要导致大批量的数据读取,比如,前面的语句,假如没有title条件,并且有limit,那肯定执行飞快。 如果有title条件,但是索引是对createtime起作用,那么mysql读取出十万的数据,然后再剔除掉不要的记录,即使有limit,也起不到作用,仍然导致10万的数据读取。 问题在于索引没用到刀刃上。工具就是善用explain。 |
|
返回顶楼 | |
发表时间:2008-08-14
但问题是需求如此,没有什么更好的办法去绕过。
能不能介绍一些优化配置的方法? |
|
返回顶楼 | |
发表时间: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的作用。 |
|
返回顶楼 | |
发表时间:2008-08-14
yy一个变通的方法。搞几台机器,作为镜像库,将查询都发送给这些库,这些库用内存当硬盘用。
|
|
返回顶楼 | |
发表时间:2008-08-14
把20w的数据全部取出来,时间无论如何都短不了!
如果数据量大,要想快:1.竭尽所能避免表扫描;2.竭尽所能取最少的数据。 |
|
返回顶楼 | |
发表时间:2008-08-15
全文检索的需求吧,用like怎么优化都没用。
貌似mysql的中文全文检索支持度不高,不过也可以试试。 单独使用全文检索引擎也是不错的选择,比如lucene。 |
|
返回顶楼 | |
发表时间: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 查询出来的数据组装起来。 |
|
返回顶楼 | |
发表时间:2008-08-16
看了半天,感觉lz表达的还是不清楚
1.到底哪些东西需要从user表里面查询出来? 2.这个查询的用途是什么?是查询出blog的内容?还是内容+所有用户信息?还是内容+部分用户信息 3.查询从外部带来了哪些限定参数?比如uid?title?。。。 对于频繁的操作,不建议用join,把必要的数据重复,放到blog表中为好,这是考虑性能。 |
|
返回顶楼 | |
发表时间:2008-08-17
对20万数据排序非常耗时,建议将聚集索引使用ID倒序
|
|
返回顶楼 | |