Mysql

隊列表的索引策略,擺脫文件排序

  • October 12, 2012

我正在嘗試擺脫文件排序操作(最好還優化瓶頸查詢)。我們使用 innodb mysql 表作為隊列來處理各種傳入的業務活動。隊列有幾十萬待處理的項目並不少見。

選擇查詢如下:

SELECT
   id,
   user,
   password,
   counter,
   idoc,
   idoc_type,
   company_id,
   host,
   job_id
FROM
   business_queue
WHERE
       finished IS NULL
   AND locked='0'
   AND created <= NOW()
   AND counter <= 5
   AND company_id = 2
ORDER BY
   business_object_priority DESC, created ASC, id ASC
LIMIT 1
FOR UPDATE

該表定義了以下索引:

ALTER TABLE  `business_queue` ADD INDEX compound_selector(
  `finished` ,  
  `locked`,    
  `created`,    
  `counter`,    
  `company_id`,   
  `business_object_priority` ) ;

然而我有一種感覺,它可以被大規模優化,因為目前文件排序用於排序,當我們有一個很大的待處理隊列時它有點低效。有沒有辦法完全擺脫上述查詢中的文件排序?

讓我們看一下 WHERE 子句

WHERE
       finished IS NULL
   AND locked='0'
   AND created <= NOW()
   AND counter <= 5
   AND company_id = 2
ORDER BY
   business_object_priority DESC, created ASC, id ASC

由於company_idlocked是靜態值,它們應該是索引的前導列。您的 ORDER BY 有business_object_priority DESCcreated ASC。由於這種混合順序,總會有一個文件排序需要處理。

儘管如此,我會重新排列列順序如下

ALTER TABLE  `business_queue` ADD INDEX compound_selector_new (
   `company_id`,   
   `locked`,    
   `finished`
   `business_object_priority`) ;

請注意以下事項:

  • 我刪除了created並且counter因為您在WHERE子句中指定了範圍。
  • 我保留finished,因為您需要所有記錄,company_id=2locked=0與所有已完成的 NULL 列分組。

雖然會有一個文件排序,但這應該會產生更快的行集合。

試一試 !!!

引用自:https://dba.stackexchange.com/questions/25843