سرعت کم جست و جو در جدولی با بیش از یک میلیون رکورد

2 هفته پیش
توسط علی بیات آپدیت شد
حمیدرضا ( 6741 تجربه )
2 هفته پیش
تخصص : برنامه نویس

با عرض سلام یه جدولی دارم یک میلیون رکورد داره و تعداد ستون ها آن هفت عدد هستش
کد سرچ بر اساس عملگر لایک هستش و با ایجکس سرچ میکنم به این صورت که بعد از تایپ حداقل سه کلمه میاد سرچ میکنه اما سرعت سرچ بسیار پایین هستش ؟ راه حل چی میتونه باشه ؟ ممنون از راهنمایتون
کد قسمت مدل :

public function scopeSearch($query , $keywords)
{
    $query->where('Huvudparagraf' , 'LIKE' , '%' . $keywords . '%')
        ->orWhere('Stycke1' , 'LIKE' , '%' . $keywords . '%')
        ->orWhere('Stycke2' , 'LIKE' , '%' . $keywords . '%')
        ->orWhere('Stycke3' , 'LIKE' , '%' . $keywords . '%')
        ->orWhere('Stycke4' , 'LIKE' , '%' . $keywords . '%')
        ->orWhere('Stycke5' , 'LIKE' , '%' . $keywords . '%')
        ->orWhere('Text' , 'LIKE' , '%' . $keywords . '%');
    return $query;
}

و اینم کد قسمت کنترلر :

  $keywords = request('keywords');
    $Laws = Law::search($keywords)->latest('id')->get();
mahdi khanzadi ( 67777 تجربه )
2 هفته پیش
تخصص : برنامه نویس سمت سرور

از ترکیب کش + صف استفاده کنید.

۱− یک صف تنظیم کنید و محاسباتی که باید انجام بشه رو بزارید توی صف.
۲− هر دفعه که صف ران میشه و محاسبات رو انجام میده اون رو کش کنید.
۳− اپلیکیشن شما از مقدار داخل کش استفاده کنه که باعث میشه سرعتش بالاتر بره

صف و اپلیکیشن میتونن به صورت همروند کار کنن و روی همدیگه تاثیر چندانی ندارن.

smart ( 9050 تجربه )
2 هفته پیش

سلام.
بنده دو پیشنهاد دارم که در کنار بقیه راه حل هایی که دوستان دادن میتونید استفاده کنید:

  1. از raw query استفاده کنید بجای eloquent.
  2. ستون هایی که میخواید توشون جستجو انجام بشه رو index گذاری کنید.
سیدعلی موسوی ( 86456 تجربه )
2 هفته پیش
تخصص : سی شارپ و پی اچ پی

الستیک سرچ
http://vrgl.ir/G4muI

mahdi khanzadi ( 67777 تجربه )
2 هفته پیش
تخصص : برنامه نویس سمت سرور

@juza66

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

سید محمدرضا صدیقی ( 9620 تجربه )
2 هفته پیش
تخصص : برنامه نویس تحت وب

من با حرف @khanzadimahdi موافق نیستم

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

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

mahdi khanzadi ( 67777 تجربه )
2 هفته پیش
تخصص : برنامه نویس سمت سرور

@ariaieboy

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

https://www.elastic.co/blog/found-uses-of-elasticsearch

لایو بودن و سرعت بالا ربطی به الاستیک سرچ نداره. همچنین تعداد رکورد بالا هم ربطی به الاستیک سرچ نداره. تمامی دیتابیس ها با رکورد بالا میتونن کار کنن. اما هر دیتابیسی برای کار خاصی ساخته شده.

سیدعلی موسوی ( 86456 تجربه )
2 هفته پیش
تخصص : سی شارپ و پی اچ پی

@khanzadimahdi
این روش دوستمون عادی نیست داره چندین کوئری روی داده هاش اعمال میکنه و شاید هم بخواد بیشترش کنه یا جستجو رو پیشرفته ترش کنه، داده هاش هم یک میلیون هست و شاید هم بیشتر بشه .
وقتی منابع سرور کافی در دست نداری بهترین روش استفاده از این سرچ انجین هست.

سید محمدرضا صدیقی ( 9620 تجربه )
2 هفته پیش
تخصص : برنامه نویس تحت وب

@khanzadimahdi

Elasticsearch is used for a lot of different use cases: "classical" full text search, analytics store, auto completer, spell checker, alerting engine, and as a general purpose document store. This article gives a brief overview of different common uses and important things to consider, with pointers to where you can learn more about them.

It surprises many that simple searching is among the least resource intensive tasks you can ask of Elasticsearch. If all you require is the top ten results for a regular, non-fuzzy match query, you can sustain hundreds of searches per second on collections of tens of millions of documents on inexpensive hardware. However, when you add fuzzy searching or faceted navigation to the list of requirements, the CPU and memory needs increase a lot.

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

سید محمدرضا صدیقی ( 9620 تجربه )
2 هفته پیش
تخصص : برنامه نویس تحت وب

@juza66
دقیقا حرف شما درسته
اصلا یکی از کاربرد های الستیک هم همینه که روی داده های مختلف بیاد کوئری را به بهترین حالت و با کمترین میزان مصرف سخت افزار انجام بده.
حالا نمیدونم دیگه چرا ایشون میگن الستیک بدرد کار ایشون نمیخوره

سیدعلی موسوی ( 86456 تجربه )
2 هفته پیش
تخصص : سی شارپ و پی اچ پی

@ariaieboy
واقعا نمیدونم چرا اینقدر اصرار دارن که الستیک سرچ برای کار دوستمون مناسب نیست :))))))

mahdi khanzadi ( 67777 تجربه )
2 هفته پیش
تخصص : برنامه نویس سمت سرور

@juza66
@ariaieboy
ایشون میخواد یه سرچ ساده بزنه روی دیتابیس. نمیخواد کار دیگه ای انجام بده. شما واسه یه سرچ ساده کلا یه تکنولوژی جدید که پروژه اظافه میکنی؟ یا اینکه با همین چیزایی که داری بهینه تر میکنی کاراتو؟

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

و اینکه اگه بخواد از الاستیک استفاده کنه باید کل اون یک میلیون رکورد رو توی الاستیک سرچ هم وارد کنه. به نظر شما از لحاظ عقلانی کار درستیه؟ واسه یه کوئری ساده دوتا دیتابیس داشته باشید یکی الاستیک و یکی دیتابیس اصلی که همین یه کوئری رو بتونید ران کنید!

علی بیات ( 297017 تجربه )
2 هفته پیش
تخصص : توسعه دهنده ارشد وب

روشی که @khanzadimahdi میگند، کاملا بهینه هست و بار رو از روی سرور بر میداره...

استفاده از یه دیتابیس جدا، تنها برای سرچ گزینه چندان خوبی نیست
اگر به جستجوی سریع احتیاج دارید.. میتونید سرویس الگولیا رو هم بررسی کنید
https://www.algolia.com/

برای ارسال پاسخ باید وارد سایت شوید