[英]Improve performance of a MySQL query
我有一個MySQL查詢,當前正在以2.5秒的速度運行,我想將其減少到最大2秒。
這是查詢:
SELECT SQL_CALC_FOUND_ROWS Distinct(c.id)
FROM `content` c
INNER JOIN `actions` AS action
ON c.parent_id = action.primary_id
WHERE 1 = 1
AND c.site_id IN ( 1, 2 )
AND c.type IN ( 'topic' )
AND c.status = 'visible'
AND ( c.lock = 0
OR c.site_id = 1 )
AND ( c.level IN ( 0 )
OR ( c.level IN ( 10 )
AND action.user_id = 123
AND action.type IN ( 'group_follow' ) ) )
ORDER BY c.date_updated DESC
LIMIT 20
以下是當前統計信息:
對於內容,我有以下索引:
對於操作,我具有以下指標:
任何幫助和建議,將不勝感激。
謝謝大家!
由於您正在執行“ ORDER BY c.date_updated DESC LIMIT 20”,因此您可能希望在c.date_updated上建立索引。 這樣,mysql可以首先以相反的date_updated
順序掃描該表,並在獲得20行后立即停止。
絕對應該在更改前后使用EXPLAIN
來檢查查詢,以查看優化程序是否選擇了該順序。 如果優化器沒有自然選擇它,則有多種方法可以強制使用date_updated
索引。
在where子句中,您必須有順序。 firsts必須是具有索引的列。
例如索引type_status_updateddate(類型,狀態,date_updated)
如果我們寫
where status = 'blabla' and type = '1'
索引不使用螺母
where type='1' and status='blala'
使用索引。
如果列留在索引中(多列索引),mysql使用索引。 例如索引type_status_updateddate(類型,狀態,date_updated)
如果我們在不使用status ='blablabla'索引的地方寫
這個事實確實使用多列索引不酷
和
c.type IN ( 'topic' )
可能會替換
c.type = 'topic'
對不起我的英語不好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.