برای کنترل عملياتهای همزمان، MyISAM از مکانيزم قفل گذاری در سطح جدول استفاده می کند. وقت بيشتری برای توضيح اين مکانيزم می گذارم چون اغلب درک درستی از آن نيست.
در حقيقت، سه نوع قفل در MyISAM وجود دارد.
قفل READ LOCAL: اين نوع قفل، توسط پرس و جوهایی(Query) که تنها به خواندن نياز دارند، استفاده می شود، يعنی صرفا عمليات به هنگام سازی(Update) را بلاک می کند تا از تغيير داده ها به هنگام خواندن جلوگيری کند. ساير پرس و جوهای خواندن و درج های همزمان هم قابل انجام هستند؛ اگر يک دستور INSERT بتواند داده جديدی را به آخر فايل MYD. اضافه کند به جای اينکه فضاهای خالی حاصل از عمليات DELETE را پر کند، ديگر منتظر قفل از نوع READ LOCAL نمی ماند.
READ يا قفلهای اشتراکی: اين نوع قفل گذاری، عملياتهای به هنگام سازی و تمام عملياتهای درج را مسدود می کند. اين نوع قفل عموما وقتی استفاده می شود که يک ابزار خارجی نظیر myisamcheck نيازمند دسترسی مستقيم به فایل يک جدول است.
WRITE يا قفلهای انحصاری: اين نوع قفل توسط عملياتهای حذف(DELETE) و به هنگام سازی(UPDATE) و گاهی اوقات هم دستورات درج(INSERT) استفاده می شود. ساير دسترسی ها به جدول مربوطه اعم از خواندن و نوشتن، مسدود می شوند تا به هنگام سازی ها دچار اختلال نشوند.
منظور ما از Blocking يا مسدود سازی اينست که يک Thread يا اتصال ممکن است منتظر کامل شدن عملیاتهای Thread ديگر و رهاسازی قفلی که روی جدول گذاشته است، بماند. در حاليکه اين امکان وجود دارد که به صورت دستی قفلها را قرار دهیم، خود سرويس دهنده MySQL بطور ضمنی، قفل گذاری های لازمه را برای اجرای هر دستوری که اجرا می کند، اعمال می کند.
MyISAM از Transaction يا تراکنش پشتيبانی نمی کند. در نتيجه، اين قالب ذخيره سازی در مد AUTOCOMMIT=1 عمل می کند که هر دستور، اتميک است. دقت داشته باشيد، MyISAM به ساختارهايی نظير INSERT ... SELECT و CREATE TABLE ... SELECT به چشم يک دستور نگاه می کند.
MyISAM با معماری ساده ای که دارد، کارايی بالاتر و سرريز(Overhead) کمتری را از لحاظ حافظه و بکارگيری ديسک دارد.
تهيه نسخه پشتیبان از اين جداول توسط ابزار mysqldump که ساختار و داده ها را به صورت دستورات SQL ذخیره می کند و برنامه mysqlhotcopy(نسخه باینری از فایلهای جدول) امکان پذير است. هر دوی اينها روی جدولی که قرار است از آن نسخه پشتيبان گرفته شود، قفل اشتراکی می گذارند. در صورت وجود رابطه بين جداول، قفل اشتراکی ديگری برای اطمينان از صحت اطلاعاتی نسخه پشتيبان مورد نياز است. در هنگام بروز مشکل، جداول با قالب سطر ثابت خيلی آسان تر قابل بازيابی هستند؛ زيرا ابزارهای بازيابی، دقيقا طول هر رکورد و نقطه شروع آن را می دانند. در صورت خرابی سيستم، عموما شاخص ها تحت تاثير قرار می گيرند که می توان دوباره اين شاخصها را ساخت. البته برای جدوال بزرگ، دوباره سازی شاخصها، زمان قابل توجهی را به خود اختصاص می دهد.
MyISAM MERGE
يک جدول MyISAM MERGE، خودش، هيچ داده ای ندارد، اما در عوض به چندين جدول MyISAM یکسان اشاره می کند. هر پرس و جو از جدول ادغامی، ممکن است روی یک یا چند جدول دیگر اعمال شود که از لحاظ کارکرد مشابه UNION VIEW است.
برای نمونه، ادغام کردن جداول وقتی استفاده می شود که بخواهيم داده های دوره ای را که در چندين جدول ذخيره می شود را تحليل کنيم. ذخيره چنین داده هایی در يک جدول هم از لحاظ اندازه و هم جنبه مدیریتی و پشتیبان گیری غير عملی است.
CREATE TABLE sales200401
(saleid INT UNSIGNED NOT NULL PRIMARY KEY,
dt DATETIME, INDEX (dt)) ENGINE=MyISAM;
CREATE TABLE sales200402
(saleid INT UNSIGNED NOT NULL PRIMARY KEY,
dt DATETIME, INDEX (dt)) ENGINE=MyISAM;
CREATE TABLE sales2004
(saleid INT UNSIGNED NOT NULL PRIMARY KEY,
dt DATETIME, INDEX (dt))
ENGINE=MERGE UNION=(sales200401,sales200402);
|