Mysql

Mysql InnoDB Full-Text Search IN BOOLEAN MODE 按相關性遞減的順序對行進行排序

  • March 24, 2021

Boolean Full-Text Searches的官方文件中:

布爾全文搜尋具有以下特徵:

  • 它們不會自動按照相關性遞減的順序對行進行排序。

但是,在執行全文搜尋時IN BOOLEAN MODE(mysql v8.0.23),它們按相關性按相關性遞減的順序排序,而不必使用ORDER BY score

SELECT product_category_id,
MATCH(product.barcode, product.brand_name, product.generic_name) AGAINST('paracetamol*' IN BOOLEAN MODE) as score
FROM product
WHERE 
MATCH(product.barcode, product.brand_name, product.generic_name) AGAINST('paracetamol*' IN BOOLEAN MODE);

結果:

+---------------------+--------------------+
| product_category_id | score              |
+---------------------+--------------------+
|                  97 | 3.4546611309051514 |
|                  91 | 3.4546611309051514 |
|                  91 | 3.4546611309051514 |
|                  91 | 3.4546611309051514 |
|                 123 | 3.4546611309051514 |
|                 123 | 3.4546611309051514 |
|                  91 | 3.4546611309051514 |
|                  91 | 1.7273305654525757 |
|                  97 | 1.7273305654525757 |
|                  97 | 1.7273305654525757 |

我在這裡錯過了什麼?

(一個猜想)

即使沒有ORDER BY. 但是,這通常是實現的產物,而不是保證的順序。

曾經是GROUP BY自動對結果進行排序,就好像有匹配一樣ORDER BY。然而,作為保證的存在阻礙了優化器。有了適當的INDEX,這樣的分組將繼續有序。但對於其他情況,優化器寧願使用記憶體中的雜湊表;這基本上保證了某種隨機順序;此外,它使獲得訂單成為一項額外的工作。

所以,我想,該手冊為未來的優化打開了大門。

規則:如果您想要特定的訂單,請指定ORDER BY. 如果優化器發現程式碼可以(或可以)保證訂單而不需要做任何額外的工作,它就會這樣做。

PS,在過去,您可以GROUP BY's通過說ORDER BY NULL. (笨拙的?)

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