簡體   English   中英

使用AS和子查詢的慢MySQL查詢

[英]Slow MySQL query with AS and 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 

這將根據用戶添加到其帳戶的網站輸出故事列表。 排名由得分決定,得分由子得分列組成。

該查詢使用文件排序,並使用PRIMARY和feedid上的索引。 解釋結果:

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”這樣的其他搜索模式也更快。

查看您的EXPLAIN ,您的查詢似乎沒有使用任何索引(因此是文件排序)。 這是由計算列( score )上的排序引起的。

另一個障礙是表格的大小(729263行)。 您不想創建一個太大的索引,因為它會占用更多空間並影響CUD操作的性能。 我們想要做的是將選定的列作為目標,但是,在這種情況下,由於它是計算所得的列,所以我們不能。 您可以嘗試創建一個VIEW ,或者刪除排序或在應用程序層進行排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM