簡體   English   中英

提高MySQL查詢的性能

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

以下是當前統計信息:

  • 表內容有55k行
  • 表操作有87k行

對於內容,我有以下索引:

  • parent_id(parent_id)
  • user_id(user_id)
  • type_status_date(類型,狀態,日期)
  • type_status_updateddate(類型,狀態,date_updated)
  • site_id(site_id)
  • type_status_level(類型,狀態,級別)
  • type_parentid_level(類型,parent_id,級別)

對於操作,我具有以下指標:

  • primary_id(primary_id)
  • site_id(site_id)
  • 類型(type)

任何幫助和建議,將不勝感激。

謝謝大家!

由於您正在執行“ 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.

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