• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
UUID - Universal Unique IDentifer
#1
"مبحثی در خصوص UUID - Universal Unique IDentifer:
یک UUID تضمین میکنه که در هر جدول و هر جا بصورت مستقل ( آفلاین ) تولید بشه منحصر به فرد خواهد بود و این بدلیل ساختار UUID هست که یک بخش اون timestamp یک بخش مربوط به مشخصات کامیپوتر و ... هستش.
کاربرد UUID که مشابه guid در ویندوز و sql server هست باعث میشه کلیدهای ما primary key در محیط های توزیع یافته که دیتابیس در چندین نقطه بصورت مستقل نصب میشن ، تکراری نشه. و البته مدیریت اون از سایر دیتا تایپ ها ساده تر بشه ( مثلا در مقایسه با varchar یا integer).
مشکلی که در UUID هست دو تا چیزه. اول اینکه 36 کاراکتر هست و خیلیا از varchar36 استفاده میکنن. خب این باعث میشه که سایز فایل ایندکس زیاد بشه و mysql نتونه کل فایل ایندکس رو در حافظه جا بده و لذا افت سرعت پیدا بشه.

مسئله دوم اینه که چون ساختار UUID در حالت عادی sequential نیست و رندوم هست لذا ایندکس که در قالب B-tree قرار میگیره کارایی کمتری داشته باشه.
مشکل دیگه اینه که insert کردن دیتای random کارایی کمتری ارائه میده.
در این نوشتار سعی شده روشهایی برای رفع این مشکل و بهینه سازی UUID ارائه بشه.

ساختار UUID :
58e0a7d7–eebc–11d8-9669-0800200c9a66
- سه بخش اول از timestamp تولید میشه یعنی 58e0a7d7–eebc–11d8
- بخش چهارم در حالتی که ممکنه time stamp بدلیل تغییر ساعت نتونه تضمین کنه که منحصر بفرده استفاده میشه. یعنی 9669
- بخش پنجم از مشخصات کامیپوتر تولید میشه. که باعث بشه وقتی در دو کامیپوتر بصورت همزمان uuid تولید شد منحصر بفرد باقی میمونه.
اول اینکه میشه این کد 36 رقمی رو علامتهای - رو ازش حذف کرد و بشه 32 کاراکتر. سپس میشه این رو بجای ذخیره در فیلد کاراکتری با سایز 32 در فیلد binary(16) ذخیره کرد که سایز کمتری داره و لذا ایندکس میتونه بهتر در حافظه جا بشه.
58e0a7d7–eebc–11d8-9669-0800200c9a66
در uuid بالا در قسمت 11d8 اولین کاراکتر یعنی 1 شماره ورژن uuid هست.
بخش چهارم و پنجم uuid غالبا ثابت خواهد بود ( در کامپیوتری که تولید شده) .
و با حذف علامتهای - میرسیم به :
11d8eebc58e0a7d796690800200c9a66
این تغییر از آن جهت صورت پذیرفت تا تا حد امکان uuid ساختار squential داشته باشه.

فانکشن زیر در mysql میتونه این نوع uuid رو تولید بکنه:

کد:
CREATE  FUNCTION ordered_uuid(uuid BINARY(36))
RETURNS binary(16) DETERMINISTIC
RETURN UNHEX(CONCAT(SUBSTR(uuid, 15, 4),SUBSTR(uuid, 10, 4),SUBSTR(uuid, 1, 8),SUBSTR(uuid, 20, 4),SUBSTR(uuid, 25)));
ورودی این فانکشن یک UUID معمولی و خروجی اون UUID تغییر یافته هستش.
بنچمارک های صورت پذیرفته ثابت میکنه که این روش به شدت در کاراایی UUID مخصوصا در دیتابیس های بزرگ تاثیر داره.

گروه نرم افزاری پاساک"
منبع: https://telegram.me/anouri
وبلاگ: Yousha.Blog.ir


 کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بالاتر => نگهداری بهتر

  پاسخ
تشکر شده توسط : undefined mohammadhosain farhadhp hamid_80386 Reza


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان