我不确定这是否是sql服务器优化问题或查询问题,但这是可行的。
我有一个数据库,这些数据库来自我继承的各种新闻媒体。有两个表:news_articles和news_outlets。我正在尝试确定不同文章的数量,以允许同一文章在多个商店中发布(数据库中有很多重复项)。
这是我的查询:
SELECT outs.id, outs.site, COUNT(DISTINCT CONCAT(arts.body_text, outs.site)) AS Article_Count, outs.alignment
FROM news_articles arts
INNER JOIN
news_outlets outs ON arts.outlet_id = outs.id
WHERE
arts.search_perc > 0.0
AND
arts.search_perc < 0.85
AND
outs.out_type < 3
GROUP BY outs.site, outs.alignment
注意:不幸的是,由于数据库的原始设计(我没有时间来修复),每个实际新闻媒体也有多个outlet_id(想象一下,一个Web爬网程序为mobile.cnn.com和www返回相同的页面。 cnn.com,您就会遇到问题;每个问题都有一个单独的outlet_id)。那不是我现在可以轻松解决的问题。
在outs.site,outs.alignment,id和outs.out_type上都有索引。所有表都是innodb。news_outlets中大约有800条记录,news_articles中大约有600万条记录。这是使用MySQLdb从python连接到服务器(在同一工作站上)运行的。该工作站是今年推出的2.7GHz i5,配备16GB内存。我没有对my.cnf进行太多更改,但是我做了修改:innodb_buffer_pool_size = 12288M
两种方法似乎都没有太大的区别。
该查询运行了很长时间(尽管并非总是如此-当我昨晚运行非常相似的查询时,它看起来要快得多)。我知道它在做很多事情,所以可以理解。但是EXPLAIN表示,有2个简单的过程:一个使用where进行文件排序;另一个使用文件排序。另一个使用索引条件和位置。
每当我运行SHOW进程列表时,它都会说查询正在创建排序索引。然而,CPU使用率最高可达5%。
这是服务器优化问题吗?查询优化问题?我该如何解决?我大约有60个这样的查询要运行-没有一个已经完成;我倾向于在10-20分钟后杀死他们。
先感谢您。
评论回应
我将假定计数需要大量无法优化的处理(至少不是在MySQL中)。你需要这个吗?您是否需要以这种方式计算?因为您是通过id加入outs,所以我认为outs.site对于每个concat都不会有所不同。因此,至少将其更改为COUNT(DISTINCT arts.body_text)。
您无需检查两个字段,因为outs.site将不可能在一个结果行中进行更改。您正在该列上进行分组。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句