Mysql
隊列表的索引策略,擺脫文件排序
我正在嘗試擺脫文件排序操作(最好還優化瓶頸查詢)。我們使用 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_id
和locked
是靜態值,它們應該是索引的前導列。您的 ORDER BY 有business_object_priority DESC
和created ASC
。由於這種混合順序,總會有一個文件排序需要處理。儘管如此,我會重新排列列順序如下
ALTER TABLE `business_queue` ADD INDEX compound_selector_new ( `company_id`, `locked`, `finished` `business_object_priority`) ;
請注意以下事項:
- 我刪除了
created
並且counter
因為您在WHERE
子句中指定了範圍。- 我保留
finished
,因為您需要所有記錄,company_id=2
並locked=0
與所有已完成的 NULL 列分組。雖然會有一個文件排序,但這應該會產生更快的行集合。
試一試 !!!