我正在尋找一種更快的方法來計算 SQL 中的歐幾里得距離。
- 我想解決的問題
下面的“歐幾里得距離計算”很慢。
SELECT
id,
sqrt(
power(f1 - (-0.09077361), 2)
power(f2 - (0.10373443), 2)
...
...
power(f127 - (0.0778369), 2)
power(f128 - (0.00951046), 2)
) as distance
FROM
face_feature
ORDER BY
distance
LIMIT
1
;
- 我想知道的
你能分享如何從“浮動”遷移到“點”嗎?
我收到了以下建議,但我不明白如何。
切換到 POINT 和 SPATIAL 索引。您的任務可能會更快幾個數量級。
- MySQL
mysql> SHOW VARIABLES LIKE '%version%';
-------------------------- ------------------------------
| Variable_name | Value |
-------------------------- ------------------------------
| version | 8.0.29 |
| version_comment | MySQL Community Server - GPL |
| version_compile_machine | x86_64 |
| version_compile_os | Linux |
-------------------------- ------------------------------
- 桌子
mysql> desc face_feature;
------- ------------ ------ ----- --------- ----------------
| Field | Type | Null | Key | Default | Extra |
------- ------------ ------ ----- --------- ----------------
| id | int | NO | PRI | NULL | auto_increment |
| f1 | float(9,8) | NO | | NULL | |
| f2 | float(9,8) | NO | | NULL | |
..
| f127 | float(9,8) | NO | | NULL | |
| f128 | float(9,8) | NO | | NULL | |
------- ------------ ------ ----- --------- ----------------
- 資料
mysql> SELECT count(*) FROM face_feature;
----------
| count(*) |
----------
| 100003 |
----------
mysql> SELECT * FROM face_feature LIMIT 1\G;
id: 1
f1: -0.07603023
f2: 0.13605964
...
f127: 0.09608927
f128: 0.00082345
- 參考(我的另一個問題)
如何在 MySQL 中更快地進行“歐式距離計算”?
uj5u.com熱心網友回復:
不要使用
FLOAT(M,N)它會增加額外的舍入,只會損害各種操作。FLOAT(9,8), 如果數字接近 "1.0" 將失去一些精度。這是因為任何FLOAT.(m,n)在較新版本的 MySQL 中已啟用FLOAT并DOUBLE已被棄用(因為無用且具有誤導性)。有一些輔助函式可以將數字字串轉換為
POINT值。在內部, aPOINT包含兩個DOUBLEs。因此,原始DECIMAL(9,8)檔案僅在第 53 個有效位丟失了從十進制到二進制的舍入。
但真正的問題是SPATIAL當宇宙有 128 個維度時使用索引。我不認為它會起作用。(我什至沒有聽說過使用SPATIAL3 維,雖然它應該是實用的。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/468614.html
