علیرضا
6 ماه پیش توسط علیرضا مطرح شد
6 پاسخ

دلیل بالا اومدن سریع یک صفحه وب از وبسایت

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


ثبت پرسش جدید
محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 6 ماه پیش مطرح شد
2

سلام و عرض ادب
ببین این یه مقوله خیلی بزرگ هست روش های زیادی داره
اما به طور کلی و ساده و ابتداییش بخاییم حرف بزنیم در مرحله اول باید بدونی که همون mysql برای سرچ چند صد هزار رکوردی هم در سریع ترین زمان ممکن بهت جواب میده
من خودم پروژم چندین هزار رکورد داره و با ارتباطات بین چند جداول دیگه که اونا هم چند هزار رکورد دارن لگ و کندی ای رو حس نمیکنم
اما در رابطه با ایندکس کردن سوال کردی بهت توضیح بدم که چی هست و یعنی چی
index یعنی فهرست و شاخص
شما فیلدی از جدولت که فکر میکنی بیشترین جستجو رو داره رو میایی به دیتابیست میگی ایندکسش کن ( خیلی راحت فقط میگی اندکس بشه همین ) کاری که انجام میشه در مراحل اولیه و جستجو های ابتدایی شما هییییییییییییچ تفاوتی احساس نمیکنی
ایندکس به این شکل عمل میکنه ک با هر سرچ ، برای سرچ های بعدی میاد یه جورای اولویت دهی میکنه اطلاعات رو
مثلا میبینه فلان رکورد زیاد درخواست شده ، جواب ها و خروجی ها بیشتر اینجا بوده ، میاد محدوده سرچ خودش رو برای خودش کمتر میکنه و بر اساس اولویتی که خودش توی مکانیزمش داره اطلاعات رو پیدا میکنه
این رو باید بدونی که ایندکس کردن بی مورد و الکی باعث کند تر شدن درخواست هات میشه چون با هر درخواست یه عمل اضافه بررسی جدول ایندکس و ثبت و داستانای اولویت اونو داری ( که برات قابل مشاهده نیست توی جداول خود mysql قرار داره نه پروژه ی تو )
حتما باید چیزی ایندکس بشه که تکرار پزیره و درخواست تکراری زیادی براش وجود داره

اما در رابطه با دیجیکالا
ما یه ساز و کاری در سرچ داریم که خیلی پیشرفته تره
اونم سرچی هست که میاد یه متن رو ( شامل چند کلمه کنار هم منظورم ) به بخش های کلمه کلمه جدا میکنه
هر کلمه رو سریع سرچ میکنه
چیزی رو به نمایش میزاره که بیشترین همخونی با متن سرچ شده رو داشته باشه
مثال میزنم
اگر توی پروژت فرض کن چیزی به اسم " دوره ی پروژه محور لاراول " داشته باشی و یکی بیاد سرچ کنه " دوره ی لاراول " تو هیچ نتیجه ای بهش نشون نمیدی چون like پاسخ گو این جستجو نیست
باید کلمه ی دوره و لاراول جدا سرچ بشن و نتایجی که حاوی هر دوی این کلمات باشه نمایش داده بشه ( و یا فقط یکی )
اینو میتونی توی همین سایت راکت امتحان کنی
این داده های مورد جستجو هم کش میشن هم ایندکس و واقعا چیزی نیست که شخص بخواد خودش پیاده کنه
باید از پکیج ها و سرویس های موجود کمک بگیری

توی این حالت سرچ شما نیاز به cache کردن داده ها داری ( معمولا از یک سرویس جانبی استفاده میکنن )
یعنی شما عمل سرچ دیتابیس رو کلا به یه سرور و سرویس دیگه ای که قبلا داده ها رو داره واگذار میکنی جون به شدت کار سنگینی هست
حتی api داریم براش یعنی شما دیتا رو میدی به اونا هر بار که چیز جدید ذخیره میکنی و برای سرچ هم از اونا کمک میگیری
این چند سایت رو ببین ( Algolia, Meilisearch, Typesense )

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


oss_vahid
تخصص : wp developer
@ossvahid 6 ماه پیش مطرح شد
0

داخل دیتابیس mysqli ما داده های که سرچ خور هستن رو index میکنیم همین باعث میشه که این داده ها یجا تو حافظه mysqli ذخیره بشه
الان دیگه وقتی جستجو میشه mysqli میره رو ایندکس ها جستجو میکنه و خیلی سریع داده هارو میاره


علیرضا
@alireza.gh147 6 ماه پیش آپدیت شد
0

میشه بیشتر توضیح بدید لطفا
ایندکس میکنیم دقیقا یعنی چی و اینکه تو وبسایت های بزرگ برای مثال دیجی کالا چجوری این اتفاق میفته اون جستجو چجوری انجام میشه؟ شاید دیتابیس همچین نرم افزار هایی اصلا mysql نباشه
این کار به چه مبحث و مفهومی در دیتابیس ها برمیگرده
@ossvahid
@sinashahoveisi
@salar.mohammad2013
@Raymond


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 6 ماه پیش مطرح شد
2

سلام و عرض ادب
ببین این یه مقوله خیلی بزرگ هست روش های زیادی داره
اما به طور کلی و ساده و ابتداییش بخاییم حرف بزنیم در مرحله اول باید بدونی که همون mysql برای سرچ چند صد هزار رکوردی هم در سریع ترین زمان ممکن بهت جواب میده
من خودم پروژم چندین هزار رکورد داره و با ارتباطات بین چند جداول دیگه که اونا هم چند هزار رکورد دارن لگ و کندی ای رو حس نمیکنم
اما در رابطه با ایندکس کردن سوال کردی بهت توضیح بدم که چی هست و یعنی چی
index یعنی فهرست و شاخص
شما فیلدی از جدولت که فکر میکنی بیشترین جستجو رو داره رو میایی به دیتابیست میگی ایندکسش کن ( خیلی راحت فقط میگی اندکس بشه همین ) کاری که انجام میشه در مراحل اولیه و جستجو های ابتدایی شما هییییییییییییچ تفاوتی احساس نمیکنی
ایندکس به این شکل عمل میکنه ک با هر سرچ ، برای سرچ های بعدی میاد یه جورای اولویت دهی میکنه اطلاعات رو
مثلا میبینه فلان رکورد زیاد درخواست شده ، جواب ها و خروجی ها بیشتر اینجا بوده ، میاد محدوده سرچ خودش رو برای خودش کمتر میکنه و بر اساس اولویتی که خودش توی مکانیزمش داره اطلاعات رو پیدا میکنه
این رو باید بدونی که ایندکس کردن بی مورد و الکی باعث کند تر شدن درخواست هات میشه چون با هر درخواست یه عمل اضافه بررسی جدول ایندکس و ثبت و داستانای اولویت اونو داری ( که برات قابل مشاهده نیست توی جداول خود mysql قرار داره نه پروژه ی تو )
حتما باید چیزی ایندکس بشه که تکرار پزیره و درخواست تکراری زیادی براش وجود داره

اما در رابطه با دیجیکالا
ما یه ساز و کاری در سرچ داریم که خیلی پیشرفته تره
اونم سرچی هست که میاد یه متن رو ( شامل چند کلمه کنار هم منظورم ) به بخش های کلمه کلمه جدا میکنه
هر کلمه رو سریع سرچ میکنه
چیزی رو به نمایش میزاره که بیشترین همخونی با متن سرچ شده رو داشته باشه
مثال میزنم
اگر توی پروژت فرض کن چیزی به اسم " دوره ی پروژه محور لاراول " داشته باشی و یکی بیاد سرچ کنه " دوره ی لاراول " تو هیچ نتیجه ای بهش نشون نمیدی چون like پاسخ گو این جستجو نیست
باید کلمه ی دوره و لاراول جدا سرچ بشن و نتایجی که حاوی هر دوی این کلمات باشه نمایش داده بشه ( و یا فقط یکی )
اینو میتونی توی همین سایت راکت امتحان کنی
این داده های مورد جستجو هم کش میشن هم ایندکس و واقعا چیزی نیست که شخص بخواد خودش پیاده کنه
باید از پکیج ها و سرویس های موجود کمک بگیری

توی این حالت سرچ شما نیاز به cache کردن داده ها داری ( معمولا از یک سرویس جانبی استفاده میکنن )
یعنی شما عمل سرچ دیتابیس رو کلا به یه سرور و سرویس دیگه ای که قبلا داده ها رو داره واگذار میکنی جون به شدت کار سنگینی هست
حتی api داریم براش یعنی شما دیتا رو میدی به اونا هر بار که چیز جدید ذخیره میکنی و برای سرچ هم از اونا کمک میگیری
این چند سایت رو ببین ( Algolia, Meilisearch, Typesense )

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


علیرضا
@alireza.gh147 6 ماه پیش آپدیت شد
0

ممنونم از توضیحات کامل و موثرت
فقط یه سوال دیگه میمونه میخوام ببینم دقیقا به چه مفهومی تو دیتابیس ربط داره؟؟
مثلا سایت دیجی کالا رو تست کردم هر محصولی رو که از دسته بندی ها انتخاب میکنی سریع اون محصولات رو لود میکنه از دیتابیس و یا اینکه از قسمت search bar مثلا میزنی آیفون 11 سریع محصولات مرتبط با آیفون 11 رو نمایش میده این کار مربوط میشه به بحث cache یا اینکه چیز دیگه ای هست .


developer
تخصص : برنامه نویس
@developer 6 ماه پیش مطرح شد
1

سلام
بحث ایندکس کردن دیتا توی دیتابیس برمیگرده به نحوه جستجو،
فرض کنید یک میلیون داده دارید و میخواین داده شماره 900 هزارم رو پیدا کنید، حالت عادی اینجوریه که از همون اول یکی یکی میره جلو و چک میکنه آیا آیدی 900 هزار هست یا نه، و اینجوری 900 هزار تا سطر رو چک میکنه که خیلی کنده
حالت ایندکس شده اینجوریه که میگید داده ها بر اساس مثلا فلان ستون ایندکس بشن، مثلا بر اساس آیدی، حالا ایندکس چیه؟ یعنی الگوریتم b-tree رسم بشه، یعنی توی پس زمینه هر موقع یک داده جدید درست میکنید یکبار میاد کل دیتا رو نمودار درختی اش رو بر اساس اون ستون مرتب میکنه، و وقتی دنبال آیدی 900 هزارم میگردید اول میپرسه کمتر از 500 هزار هست یا بیشتر، بعد میگه کمتر از 750 هزار هست یا بیشتر و ... ، اینجوری با چک کردن 5 6 ردیف داده اون آیتم رو پیدا میکنه و نمیخواد 900 هزار تا رو چک کنه.

روش دیگه همون کش کردن هست که دیتایی که میخواین رو توی رم ذخیره میکنید مثلا توی ردیس یا ممکش و از اونجا فراخوانی میکنه و نمیره به دیتابیس اصلی کوئری بزنه


Majid Goudarzi
تخصص : برنامه نویس
@masterspyware 6 ماه پیش مطرح شد
1

البته همیشه با index کردن نیست.
بعضی مواقع،به نسبت علاقه مندی شما،بعضی دیتاها بصورت خودکار درون localstorage مرورگر شما ذخیره میشه و اصطلاحا cache میشه.

بعضی سایت ها هم بخاطر اینکه سنگینن و کاربر اذیت نشه،قالب و دیتاهای غیرضرورشونو داخل localstorage شما cache میکنن تا با حداقل ping ممکن بهتون دیتا بدن


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام