我对运行 10 秒以上的慢速查询有疑问:
SELECT DISTINCT siteid,
storyid,
added,
title,
subscore1,
subscore2,
subscore3,
( 1 * subscore1 + 0.8 * subscore2 + 0.1 * subscore3 ) AS score
FROM articles
WHERE added > '2011-10-23 09:10:19'
AND ( articles.feedid IN (SELECT userfeeds.siteid
FROM userfeeds
WHERE userfeeds.userid = '1234')
OR ( articles.title REGEXP '[[:<:]]keyword1[[:>:]]' = 1
OR articles.title REGEXP '[[:<:]]keyword2[[:>:]]' = 1 ) )
ORDER BY score DESC
LIMIT 0, 25
这会根据用户添加到其帐户的网站输出故事列表。排名由分数决定,分数由子分数列组成。
查询使用 filesort 并使用 PRIMARY 和 feedid 上的索引。 EXPLAIN 的结果:
1 PRIMARY articles
range
PRIMARY,added,storyid
PRIMARY 729263 rows
Using where; Using filesort
2 DEPENDENT SUBQUERY
userfeeds
index_subquery storyid,userid,siteid_storyid
siteid func
1 row
Using where
有什么改进这个查询的建议吗?谢谢。
最佳答案
我会把计算逻辑移到客户端,只从数据库加载字段。这使您的查询和计算本身更快。在 SQL 代码中做这样的事情不是一个好的风格。 而且正则表达式非常慢,也许另一种搜索模式如“LIKE”更快。
关于mysql - 使用 AS 和子查询的慢速 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13012989/