mysql - 使用 AS 和子查询的慢速 MySQL 查询

标签 mysql database performance optimization subquery

我对运行 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/

相关文章:

php - 未连接mysql时更改正文

python - 如何向量化Python for循环来修改数据帧的每个元素?

mysql - 如何像关系表一样检索 MySQL EAV 结果

mysql - SQL:找到最接近给定值的数字

database - 像 Caché 这样的面向对象数据库,但它是免费的并且适用于 .NET?

jquery - 委托(delegate)和绑定(bind) : Is there a performance sweet spot?

sql - mysql为每场比赛设置一个标志

mysql - 重新使用sql server中现有的选定列?

javascript - 插入一个字母大写字母时,Sequelize 返回小写字母?

node.js - Sequelize [object SequelizeModel] 保存不是函数