[英]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.