تخزين Mysql Guid / Uuids
سؤال
هذه هي أفضل طريقة يمكن أن أتناولها لتحويل MySQL GUID / UUID الناتجة عن UUID () إلى ثنائي (16):
UNHEX(REPLACE(UUID(),'-',''))
ثم تخزينها في ثنائي (16)
هل هناك أي آثار على القيام بذلك بهذه الطريقة التي يجب أن أعرفها؟
المحلول
ليس الكثير من الآثار. سوف تبطئ الاستعلامات قليلا، لكنك بالكاد تلاحظ ذلك.
UNIQUEIDENTIFIER
يتم تخزينه كما 16-byte binary
داخليا على أي حال.
إذا كنت ستحميل ثنائي في عميل وتحليله هناك، لاحظ bit order
, قد يكون لها تمثيل سلسلة آخر من الأولي NEWID()
.
Oracle
'س SYS_GUID()
وظيفة عرضة لهذه المشكلة، تحويلها إلى سلسلة يعطي نتائج مختلفة على العميل وعلى الخادم.
نصائح أخرى
من MySQL 8.0 وما فوق يمكنك استخدام uuid_to_bin.:
uuid_to_bin (string_uuid), ، uuid_to_bin (string_uuid، swap_flag)
يحول سلسلة UIID إلى UUID الثنائي وإرجاع النتيجة. (دالة IS_UUID () الوصف يسرد تنسيقات UUID السلسلة المسموح بها.) The Return Binary Uuid هو قيمة Varbinary (16).
CREATE TABLE t (id binary(16) PRIMARY KEY);
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
SELECT *, BIN_TO_UUID(id) FROM t;
أرتديها في عدد صحيح 8 بايت وتخزين عدد صحيح باستخدام خوارزمية التجزئة عالية الكفاءة في اتجاه واحد مثل Murmurhash64a. هذا يستخدم مساحة أقل بكثير ويمكن فهرسة و / أو مقسمة. يوجد مشروع Sourceforge يتضمن وظائف MIMCACHED ل MySQL (http://forge.mysql.com/projects/project.php؟id=250.) والتي قد تشمل Murmurhash64a، منذ Memnchached يستخدمها، لكنني لا أعرف. أو إلقاء نظرة على تنفيذ FNV هذا ل MySQL: http://www.xaprb.com/blog/2008/03/09/a-fastery-fast-fnv-hash-function-for-mysql/