12 راه برای بهینه سازی بانکهای اطلاعاتی SQLite – اکنون آنها را امتحان کنید!

افشای: پشتیبانی شما به حفظ سایت کمک می کند! ما برای برخی از خدماتی که در این صفحه توصیه می کنیم هزینه ارجاع دریافت می کنیم.


SQLite یک سیستم مدیریت پایگاه داده رابطه ای مبتنی بر SQL (RDBMS) است که به عنوان یک کتابخانه جاسازی شده اجرا می شود. این پایگاه داده ها به جای تکیه بر مدل سرویس دهنده سرویس دهنده ، پایگاه داده ها را به عنوان فایل های گسسته ذخیره می کند.

SQLite معمولاً به سه روش مورد استفاده قرار می گیرد:

  • سهولت استفاده از آن برای آزمایش و پیشگیری برنامه های کاربردی با پشتیبانی از پایگاه داده ایده آل است.
  • از آنجا که همه چیز به صورت محلی ذخیره می شود ، و خود کتابخانه می تواند در یک برنامه تعبیه شود ، SQLite نیز اغلب به عنوان فروشگاه اصلی داده ها برای برنامه های کوچک که بصورت محلی توسط یک کاربر واحد اجرا می شود ، استفاده می شود. این شامل برنامه هایی مانند کتاب آدرس ، لیست کارهای انجام شده یا حتی خوانندگان ایمیل است.
  • سرانجام ، بانکهای اطلاعاتی SQLite معمولاً به عنوان یک فرمت فایل خاص برنامه کاربردی مورد استفاده قرار می گیرند. این به ویژه در برنامه هایی مفید است که یک فایل ذخیره شده یک پروژه پیچیده است ، نه یک سند نسبتاً ساده. در این حالت ، هر پرونده ایجاد شده توسط برنامه در واقع یک بانک اطلاعاتی کامل SQLite است.

نیاز به بهینه سازی

بیشتر اوقات ، هنگامی که از آن برای آزمایش و نمونه سازی استفاده می شود ، بهینه سازی آن برای سرعت بسیار مهم نیست. در این موارد ، این کار همیشه ممکن نیست ، زیرا ممکن است شما برنامه خود را با یک بانک اطلاعاتی متفاوت در تولید اجرا کنید. SQLite در اینجا به سادگی به عنوان پایه ایستاده برای چیز دیگری مانند PostgreSQL یا MySQL مورد استفاده قرار می گیرد.

اما وقتی SQLite مانند دو مورد دوم از “در تولید” استفاده می شود ، عملکرد اهمیت دارد. اتخاذ چند تکنیک ساده می تواند بر سرعت بروزرسانی ها و نمایش داده ها از پایگاه داده تأثیر بگذارد.

در اینجا نکات عملی برای بهبود عملکرد SQLite در برنامه های شما آورده شده است. برخی از آنها بهینه سازی پرس و جو SQL هستند که به سرعت بخشیدن به هر سیستم پایگاه داده SQL کمک می کند. برخی دیگر مخصوص بهینه سازی SQLite هستند.

از آنجا که SQLite یک مرکز داده محبوب در برنامه های Android است ، ما همچنین نکات خاصی را برای بهینه سازی عملکرد SQLite در Android ارائه داده ایم.

از معامله استفاده کنید

اولین توصیه ای که همه برای سرعت بخشیدن به SQLite می کنند ، “استفاده از معامله” است.

همه این را می گویند زیرا این ایده خوبی است. اما ممکن است تعجب کنید که چگونه از یک معامله در SQL استفاده کنید.

بیایید بگوییم شما مجموعه ای از داده ها را در برخی از ساختارهای تکرار شونده مانند یک لیست یا آرایه جمع آوری کرده اید. ممکن است وسوسه شوید که داده های خود را حلقه زده و در هر تکرار حلقه آن را در پایگاه داده SQLite خود قرار دهید.

/ ********************************************** ***
نام و نام خانوادگی را از یک پرونده دارای محدودیت در برگه دریافت کنید.
سپس آنها را در پایگاه داده SQLlite وارد کنید.
*********************************************** ** /

/ * حتماً این موارد را در زندگی واقعی تعریف کنید…
#define DATABASE = // نام بانک اطلاعاتی //
#define FILE_OF_NAMES = // مسیر پرونده //
#define CREATE_TABLE = // عبارت SQL برای ایجاد جدول نام ها //
* /

sqlite3_open (DATABASE), &db)؛
sqlite3_exec (db، CREATE_TABLE، NULL، NULL), &sErrMsg)؛

pFile = fopen (FILE_OF_NAMES,"r")؛
در حالی که (! feof (pFile)) {

fget (sInputBuf ، BUFFER_SIZE ، pFile)؛

sFirstName = strtok (sInputBuf, "تی")؛
sLastName = strtok (NULL), "تی")؛

sprintf (sSQL), "INSERT INTO NAME VALUES (NULL ، ‘٪ s’ ، ‘٪ s’ ،)", sFirstName ، sLastName ، s)؛
sqlite3_exec (db، sSQL، NULL، NULL), &sErrMsg)؛

n ++؛
}
fclose (pFile)؛
sqlite3_close (db)؛

این یک ایده بد است. این هر یک از اجزای یک معامله واحد را اتمی می کند – هرکدام دارای سربار خاص خود هستند. اگر فقط یک درج زن و شوهر داشته باشید ، خیلی مهم نیست ، اما حتی با کد C که سریعاً اجرا می شود ، می تواند سرعت شما را به زیر 100 درج ثانیه برساند. اگر از SQLite به عنوان یک قالب پرونده برنامه استفاده می کنید ، این به طور بالقوه می تواند به معنای کاربران باشد که هر بار ذخیره یک سند یا پروژه پیچیده ، چند ثانیه تأخیر را تجربه می کنند.

به جای قرار دادن مجموعه داده های خود به صورت جداگانه ، تمام درج های خود را در یک معامله واحد قرار دهید. این باعث افزایش چشمگیر درج های شما می شود. و این یک تغییر بسیار آسان است.

/ * قبل از حلقه – معامله را شروع کنید * /
sqlite3_exec (db, "شروع به کار", NULL ، NULL, &sErrMsg)؛

pFile = fopen (FILE_OF_NAMES,"r")؛
در حالی که (! feof (pFile)) {
.
.
.
}

fclose (pFile)؛

/ * بعد از حلقه – پایان معامله * /
sqlite3_exec (db, "انتقال نهایی", NULL ، NULL, &sErrMsg)؛

شما همچنان عبارت INSERT را در داخل حلقه اجرا می کنید ، اما آنها در حال بارگذاری پایگاه داده در هر تکرار نیستند. در عوض ، SQLite تمام اظهارات شما را در یک حافظه پنهان ذخیره می کند ، و بعد از پایان انتقال ، همه آنها را به صورت یکجا اجرا می کند..

از آنجا که درج ها همه در حافظه پنهان ذخیره می شوند ، ممکن است لازم باشد اندازه حافظه نهان خود را بالا ببرید تا از مزیت سرعت استفاده از تراکنش ها به این روش بهره مند شوید..

/ * بعد از باز کردن اتصال db,
قبل از شروع معامله * /
sqlite3_exec (db, "PRAGMA cache_size = 10000", NULL ، NULL, &sErrMsg)؛

معاملات در Android

API داخلی SQLite داخلی Android استفاده از تراکنش ها را حتی ساده تر می کند.

// برای شروع معامله
db.beginTransaction ()؛

// برای پایان دادن به یک معامله
db.endTransaction ()؛

همچنین ممکن است بخواهید بررسی کنید که آیا استثنائاتی قبل از انجام معامله وجود داشته است یا خیر ، در صورت بروز مشکل خطا را وارد کنید. این نیز در اندروید آسان است.

تلاش كردن {
db.beginTransaction ()؛

/ * کارها را به صورت حلقه انجام دهید. * /

db.setTransactionSuccessful ()؛ // در صورت عدم استثنا ، این معامله را انجام می دهد

} گرفتن (استثناء e)
Log.w ("استثنا:", ه)؛
} سرانجام {
db.endTransaction ()؛
}

آماده و صحافی کنید

در آخرین مثال ، عبارت SQL در حین اجرای هر حلقه دوباره ایجاد شد. این بدان معنی است که هر بار توسط SQLite تجزیه و تحلیل می شد. این تجزیه دارای برخی از سربارهای محاسباتی است که با هر تکرار چیزها را کند می کند.

با آماده سازی عبارت SQL در خارج از حلقه می توانید کارها را سرعت بخشیده و هر بار که از آن استفاده می کنید داده های خود را به آن متصل کنید.

/ * قبل از شروع معامله * /
sprintf (sSQL), "INSERT INTO NAME VALUES (NULL ،FirstName ،LastName)")؛
sqlite3_prepare_v2 (db، sSQL، BUFFER_SIZE, &stmt, &دم)؛

sqlite3_exec (db, "شروع به کار", NULL ، NULL, &sErrMsg)؛

pFile = fopen (FILE_OF_NAMES,"r")؛
در حالی که (! feof (pFile)) {

fget (sInputBuf ، BUFFER_SIZE ، pFile)؛

sFirstName = strtok (sInputBuf, "تی")؛
sLastName = strtok (NULL), "تی")؛

sqlite3_bind_text (stmt، 1، sFirstName، -1، SQLITE_STATIC)؛
sqlite3_bind_text (stmt، 2، sLastName، -1، SQLITE_STATIC)؛

sqlite3_step (stmt)؛

sqlite3_clear_bindings (stmt)؛
sqlite3_reset (stmt)؛

n ++؛
}
fclose (pFile)؛
sqlite3_exec (db, "انتقال نهایی", NULL ، NULL, &sErrMsg)؛
sqlite3_close (db)؛

این استراتژی می تواند در خارج از حلقه ها نیز مورد استفاده قرار گیرد. اگر یک پرس و جو در داخل یک عملکرد دارید ، می توانید یک بار آن را آماده کرده و هر بار که استفاده شود ، آنرا ببندید.

اظهارات آماده شده در Android

API Android SQLite کلاس SQLiteStatement را برای انجام این کار به راحتی فراهم می کند.

// پرس و جو را بنویسید ، با؟ برای وارد کردن مقادیر
رشته sql = "INSERT را وارد کنید به ارزش ها (؟ ،؟)"؛

// تدوین بیانیه
عبارت SQLiteStatement = db.compileStatement (sql)؛

/ ** حلقه از طریق سوابق ** /

/ ** نام ها را از پرونده دریافت کرده و به نام و نام خانوادگی اختصاص دهید ** /

// بستن
statement.bindString (1 ، نام خانوادگی)؛
statement.bindString (2 ، نام خانوادگی)؛

// اجرای
Long row_id = statement.executeInsert ()؛

بعد از هر بارگذاری در دیسک همگام سازی نکنید

SQLite بطور پیش فرض منتظر نوشتن سیستم عامل پس از صدور هرکدام از این درج ها است. با یک دستور ساده می توانید این مکث را خاموش کنید.

sqlite3_exec (db, "همزمان PRAGMA = خاموش", NULL ، NULL, &sErrMsg)؛

این کار را بعد از باز کردن اتصال به دیتابیس ، اما قبل از شروع تراکنش قرار دهید. همچنین باید بدانید که این امر می تواند در صورت خرابی یا قطع برق باعث ایجاد فساد بانک اطلاعاتی شود. بنابراین ، شما می خواهید با افزایش سرعت در اینجا در برابر خطرات احتمالی.

فروشگاه مجله برگشتی در حافظه

اگر قبلاً به طور خطرناکی با PRAGMA همگام = خاموش زندگی می کنید ، و سعی دارید همه میلی ثانیه های اضافی را از بین ببرید ، می توانید به جای ذخیره آن بر روی دیسک ، مجله بازگرداندن را نیز در حافظه ذخیره کنید. همراه با بهینه سازی قبلی ، این کمی خطرناک است.

sqlite3_exec (db, "PRAGMA journal_mode = MEMORY", NULL ، NULL, &sErrMsg)؛

اگر می خواهید در یک مسابقه سرعت یا چیزی پیروز شوید ، می توانید Journal_mode را خاموش تنظیم کنید. (این برای استفاده در زندگی واقعی توصیه نمی شود.)

هشدار ژورنال حالت برای Android

حالت ژورنال SQLite با استفاده از روش “AndroidWriteAheadLogging” (Android) مدیریت می شود. بنابراین ، همانطور که اسناد مربوط به اجرای دستورات SQL خام می گوید:

ژورنال را با استفاده تنظیم نکنید "PRAGMA magazine_mode" درصورتی که برنامه شما از activWriteAheadLogging استفاده کند ().

فقط هنگامی که واقعاً به آن احتیاج دارید ، ایندکس کنید

توسعه دهندگان پایگاه داده ساده و بی تکلف دوست دارند برای سرعت بخشیدن به کار ، فهرست های زیادی ایجاد کنند. اما انجام این کار بی وقفه ، یا ایندکس کردن به معنای واقعی کلمه می تواند نتیجه ای نداشته باشد. فهرست كردن مطالب يك جدول توسط يك سطر خاص باعث مي شود كه سرعت خواندن سریعتر شود و آهسته تر بنویسد. و فقط باعث می شود خواندن سریعتر برای نمایش داده شد که بر اساس آن ستون جستجو می کند.

بنابراین ، اگر کاربران هرگز نمی خواهند محتوای یک جدول را بر اساس یک ستون خاص جستجو کنند ، آن را ایندکس نکنید. علاوه بر این ، اگر کاربران فقط به ندرت توسط ستون خاصی جستجو می کنند ، آن را ایندکس نکنید. حتی اگر آنها به احتمال زیاد به جستجوی مکرر بپردازند ، شما هنوز هم باید در مورد اینکه آیا جدول بیشتر نوشته خواهد شد یا جستجو می شود فکر کنید. اگر بیشتر از جستجو جستجو خواهد شد ، یا اگر سرعت نوشتن بسیار مهم است ، آن را ایندکس نکنید.

اغلب ، نوع برنامه این نیازها را دیکته می کند. SQLite معمولاً برای فروشگاههای بزرگ داده که نیاز به پشتیبانی از طیف گسترده ای از عملیات ها دارند استفاده نمی شود. به عنوان مثال ، اگر از آن به عنوان یک نوع پرونده کاربرد استفاده شود ، احتمالاً کاربر برای ذخیره سریع یک پروژه در حین کار ، احتمالاً مهمتر از آن است که بتواند در سریعترین زمان ممکن مطالب یک سند کار را جستجو کند. از طرف دیگر ، یک برنامه ذخیره سازی داده که معمولاً دارای به روزرسانی های دستی و یک ورودی است (مانند فهرست مخاطبین یا لیست کارهای انجام شده) احتمالاً می تواند نوشتن مطالب کمی کندتر داشته باشد ، اما باید از جستجوی خیلی سریع پشتیبانی کند..

فهرست پس از درج فله

پس از ایجاد فهرست در جدول ، هر درج بعد از آن زمان برای فهرست بندی محتوای جدید زمان می برد. اگر جدول شما با درج بزرگی از داده های انبوه آغاز می شود (شاید اولین باری باشد که یک پروژه یا سند جدید ذخیره می شود ، یا هنگام وارد کردن داده برای یک کاربر جدید) ، می توانید با انتظار برای ایجاد ایندکس ، اولین درج بزرگ را سرعت بخشید. تا بعد از درج.

سایر تنظیمات PRAGMA

تعدادی تنظیمات PRAGMA وجود دارد که می توانند به بهبود عملکرد SQLite شما کمک کنند.

اندازه حافظه نهان

همانطور که به طور مختصر در بالا ذکر شد ، شاید شما نیاز به افزایش اندازه cache_size خود داشته باشید. معاملات کلانی فقط درصورتی انجام می شود که کل تراکنش در حافظه پنهان ذخیره شود.

حافظه مورد استفاده برای حافظه نهان در هنگام لزوم تخصیص می یابد ، بنابراین هیچ هدفی برای تنظیم آن زیاد نیست. شما همچنین می توانید به صورت پویا تنظیم کنید – آن را برای بهینه سازی برخی از سؤالات خاص و سپس پایین آوردن آن در صورت لزوم تنظیم کنید.

sqlite3_exec (db, "PRAGMA cache_size = 100000", NULL ، NULL, &sErrMsg)؛

ذخیره سازی موقت میز

می توانید به SQLite بگویید که جداول موقت را در حافظه ذخیره کند. این باعث می شود بسیاری از عملیات خواندن که به جداول ، شاخص ها و نماهای موقت متکی هستند سرعت بخشد.

sqlite3_exec (db, "PRAGMA temp_store = MEMORY", NULL ، NULL, &sErrMsg)؛

تنظیمات Android و Pragma

می توانید از روش execSQL () برای اجرای SQL خام در برابر پایگاه داده SQL خود استفاده کنید. این مستقیم ترین روش برای تغییر هر یک از تنظیمات PRAGMA است. با این حال ، برخی از آنها (مانند Journal_mode که در بالا به آنها اشاره شد) توسط کلاسها یا یاران دیگری در API اداره می شوند.

سریعتر نمایش داده شد – خیلی زود فیلتر کنید

اگر یک پرس و جو را بر اساس چندین معیار انجام می دهید ، اغلب می توانید با استفاده مجدد از نحوه تنظیم معیارهای خود ، آن را سرعت بخشید. اگر اولین بند WHERE کمترین تعداد نتیجه را به دست آورد ، هر یک از موارد بعدی مقابله با موارد کمتری خواهد داشت.

در پرس و جو ای که تعداد زیادی پارامتر دارد ، سعی کنید چندین جابجایی مختلف سفارش را آزمایش کنید تا ببینید کدام یک از بهترین میانگین ها برخوردار است.

موارد غیرقابل انعطاف مورد برای LIKE

بند LIKE برای مقایسه متن بی حساس است. شاخص ها بصورت پیش فرض حساس به موارد هستند اگر تنها پرس و جوهای نمایه های شما برای بهینه سازی آنها نمایش داده شد LIKE ، می توانید با ایجاد حساس به فهرست خود در درج ها و نمایش داده شد..

ایجاد INDEX sLastName در نام ها (کلمات کلیدی NOCASE)؛

در صورت امکان از آخرین نسخه استفاده کنید

هر نسخه اصلی SQLite شامل پیشرفت های عملکرد است. برخی از نسخه ها سرعت چشمگیری را افزایش داده اند. بنابراین اگر از نسخه جزئی استفاده می کنید که چند ساله است (یا بدتر از آن ، هنوز هم از V2 استفاده می کنید) ساده ترین مسیر برای اجرای سریع تر ساده است.

یک پایگاه داده جدید ایجاد نکنید

این یک تغییر بزرگ در تفکر برای افرادی است که از دیگر سیستم های RDBMS به دست می آیند.

مورد استفاده از SQLite را به عنوان فرمت فایل برنامه در نظر بگیرید. هر بار که برای اولین بار در یک پروژه (پرونده) جدید در برنامه ذخیره می کنید ، به نمونه جدید پایگاه داده نیاز است.

می توانید یک پایگاه داده جدید ایجاد کنید و یک سری جمله های SQL را برای اضافه کردن جداول و فهرست های مناسب اجرا کنید. اگر می خواستید یک برنامه کاربردی قابل استقرار با (مثلاً) PostgreSQL بسازید – می خواهید این کار را انجام دهید. شما می خواهید برای راه اندازی بانک اطلاعاتی ، این کد را بنویسید..

اما یک راه سریعتر وجود دارد.

از آنجا که یک پایگاه داده SQLite یک پرونده گسسته است ، کلون کردن یک پایگاه داده نسبتاً بی اهمیت است – این به سادگی کپی کردن یک فایل است. این بدان معنی است که معمولاً ایجاد بانک اطلاعاتی جدید و سپس اجرای کلیه عبارتهای SQL موردنیاز لازم نیست. معمولاً فقط می توانید یک کپی تهیه کنید.

در Android ، ممکن است بخواهید از SQLite Asset Helper برای مدیریت پایگاه های داده به عنوان دارایی هنگام انجام این کار استفاده کنید.

Denormalizing را در نظر بگیرید

اگر با سیستم های پایگاه داده رابطه ای تجربه دارید ، شاید به عادی سازی داده های خود اهمیت زیادی دهید. چیزهای بیشتری نسبت به این وجود دارد ، اما جوهر عادی سازی داده ها این است: منبع تنها حقیقت.

در یک پایگاه داده عادی سازی رابطه ای ، هر قطعه از داده ها ، هر چقدر بی اهمیت ، دقیقا یک بار نشان داده شود. بنابراین ، به عنوان مثال ، یک پرونده به نمایندگی از یک کتاب ممکن است به سابقه ای که نویسنده را نشان می دهد اشاره کند – اما مطمئناً نام نویسنده را مستقیماً هجی نمی کند.

این موجب صرفه جویی در فضا می شود ، و ظریف تر است. اما همچنین باعث می شود زمان خواندن از بانک اطلاعات بیشتر وقت گیر شود. اگر می خواهید تمام کتاب های نویسنده را پیدا کنید ، می توانید جدول نویسنده را جستجو کنید تا شناسنامه را بدست آورید ، سپس جدول کتاب را جستجو کنید و سوابق را جمع کنید.

می توانید با کپی کردن نام نویسنده در تمام سوابق کتاب ، این نوع خواندن را سرعت بخشید. این عملکرد را بهبود می بخشد ، اما عادی سازی را قربانی می کند. علاوه بر کمبود ، این دو دلیل جانبی احتمالی نیز دارد:

  • منطق کاربرد مسئول حفظ یکپارچگی داده ها می شود (یعنی صحت یا صحت).
  • برای ذخیره کردن همین مقدار اطلاعات ، پایگاه داده باید بزرگتر باشد.

ناهنجاری در SQLite خصوصاً خوب است

تمام این نگرانی ها و مبادلات تجاری هنگام کار با هر سیستم RDBMS ، نه فقط SQLite وجود دارد. با این حال ، در SQLite ، برخی از عوامل کاهش دهنده احتمالی وجود دارد که باعث می شوند ناهمگونی سازی داده ها کمتر مشکل ساز و مفیدتر شوند.

  • به طور معمول ، یک برنامه SQLite نسبت به یک برنامه بسیار بزرگ که به سرور پایگاه داده نیاز دارد ، دارای یک داده داده (طرحواره) کمتری است. این باعث می شود تا پیچیدگی برنامه مورد نیاز برای پشتیبانی از داده های غیرمتعارف کم خطر شود.
  • مجموعه داده های پشتیبانی شده توسط بانکهای اطلاعاتی SQLite معمولاً کوچکتر از مجموعه هایی هستند که در سایر سیستم های پایگاه داده ذخیره شده اند. این بدان معنی است که افزایش اندازه از داده های کپی شده کمتر مشکل ساز است. علاوه بر این ، در مقیاس اکثر برنامه های SQLite (ذخیره فایل محلی) هزینه اندازه اضافی ناچیز است.
  • بر خلاف سرورهای بزرگ پایگاه داده (به ویژه سرویس دهنده های آنها) ، بعید است که یک برنامه دوم سعی در اتصال به پرونده های پایگاه داده SQLite ایجاد شده توسط برنامه شما داشته باشد. بنابراین ، لازم نیست از فساد داده های تصادفی و پویایی تیم مشکل ساز محافظت کنید.
  • به همین ترتیب ، به دلیل اینکه معمولاً SQLite به عنوان یک پایگاه داده تعبیه شده مورد استفاده قرار می گیرد ، اغلب یک برنامه اتصال بین ساختار و ساختار پایگاه داده وجود دارد. این بدان معنی است که نقاط ضعف در دستیابی به یکپارچگی داده ها در داخل برنامه به طور کلی پایین تر از آن چیزی است که ممکن است زمانی باشد که یک پایگاه داده و برنامه از نظر جسمی کاملاً زوج باشند ، اما در واقعیت بسیار وابسته هستند..
  • سرانجام ، برخی از پیشرفتهای عملکرد عادی سازگار با سایر سیستمهای دیتابیس – مانند نماهای مادی – در SQLite در دسترس نیستند..

به همین دلایل ، ناسازگاری برای عملکرد ، روشی بسیار متداول با SQLite از سایر پایگاههای داده رابطه است.

خلاصه

این نکات برای بهینه سازی عملکرد SQLite فقط همین موارد است. این یک برنامه دقیق برای دنبال کردن نیست ، و شما با افزودن هر آیتم از این لیست به کد خود ، برنامه SQLite خود را تسریع نخواهید کرد. آنها ایده هایی هستند که در صورت استفاده مناسب می توانند کمک کنند. بنابراین در مورد برنامه خود فکر کنید و ببینید که آیا هر یک از آنها ممکن است کمک کند. و تست کنید شما باید بدانید که چه چیزی باعث می شود برنامه شما کند شود قبل از اینکه سریع شوید.

مطالعه بیشتر و منابع

ما راهنماهای ، آموزش ها و اینفوگرافیک های بیشتری در رابطه با کد نویسی و توسعه داریم:

  • منابع SQL: منابع کلی SQL ما که برای همه توسعه دهندگان پایگاه داده رابطه ای بسیار مهم است.
  • مقدمه و منابع MySQL: یکی دیگر از سیستم های پایگاه داده بسیار محبوب.
  • مقدمه و منابع PostgreSQL: یک سیستم پایگاه داده محبوب به خودی خود ، SQLite تا حدی مبتنی بر آن است.

راهنمای نهایی برای میزبانی وب

راهنمای نهایی ما برای میزبانی وب را بررسی کنید. این کار همه چیزهایی را که باید بدانید برای ایجاد یک انتخاب آگاهانه توضیح می دهد.

راهنمای نهایی برای میزبانی وب
راهنمای نهایی برای میزبانی وب

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map