PDA

View Full Version : سوال: جستجوی سریع در دیتابیس حجیم



parsaman
جمعه 30 تیر 1391, 13:26 عصر
سلام دوستان عزیز

سایتی هست که دارای رکوردهای زیادی است نزدیک به میلیون و قصد دارم که در اون جستجو انجام بدیم که این جستجو ها به صورت متوالی هست و لود اون خیلی بالا ایت تا جاییکه تایم اوت می شه.
جستجو در دو فیلد title و descrption انجام میشه و دستور select‌زیر اگر روشی دارید که لود و فشار روی سرور کم می کنه و سریع این کار رو انجام می دهد لطفا بفرمایید ممنون میشم ......

SELECT odata.id,odata.title,odata.descrption
FROM (
SELECT id
FROM `odata`
WHERE $query
ORDER BY
`id` DESC
LIMIT 10
) o
JOIN odata
ON odata.id = o.id

باتشکر

tehro0n
جمعه 30 تیر 1391, 15:26 عصر
شما برای کوئری گرفتن از MySqli استفاده کن و آن فیلدها یا ستون هایی که زیاد select می گیری رو index قرار بده

us1234
جمعه 30 تیر 1391, 16:06 عصر
البته اگه روی سرور شما memecache وجود داشته باشه و بتونید کوئری های پرکاربرد را کش کنید بهتره سرعت وحشتناک زیاد میشه با این کار .

parsaman
جمعه 30 تیر 1391, 19:20 عصر
منون از جوابتون
ولی mysqli خیلی تفاوتی نداشت و memcash هم در سرور اوکی نیست.یکی گفت با یه query خوب میشه سرعت داد الان تو صفحه بندی مطالب اگر هر صفحه رو هم کلیک کنه کاربر دوباره اقدام به واکشی می کنه که منطقی نیست این کار ........ نظر دیگری ندارید ؟

AbiriAmir
جمعه 30 تیر 1391, 19:38 عصر
من هدف از این کوئری رو نفهمیدم :-o
چرا از 1 where ساده استفاده نمیکنید؟
ضمنا شما از mysql استفاده میکنید؟ اگر بله engine مورد استفاده شما چی هست؟
ضمنا ایندکس گذاری صحیح انجام دادید؟

parsaman
شنبه 31 تیر 1391, 10:40 صبح
where معمولی که دیگه هیچی 5 نفر پشت سر هم سرچ بزنن سرور می خوابه این کوئری برای اینکه صفحه ها رو که کلیک کردن دوباره از اول سرچ نکنه زدم ولی جواب نداد عجیبه خیلی از جاها کدها رو دیدم یا ساب کوئری یا جوینه سرعت بالایی سرچ می کنه و فچ می آره نشون می ده این تو دو تا فیلد که مشخص هم کردم سیستم هم mysql هست با ه کلاس ساده تو دیتابیس کوئری می زنیم که اصلا چیز اضافی لود نداشته باشه.
ایندکس گذاری هم اگر چیز خوبی در نظر دارید بفرمایید ممنون میشم
query$ این همون کوئری سرچ هست شاید هم این مشکل داره

$star = '%';
$query = '';
$and='';
$split_search = array();
$split_search = split(" ",$_GET['p']);
for ($i = 0;$i < count($split_search); $i++)
{
$query .= $and."(`title` LIKE '".$star.$split_search[$i].$star."' or `text` LIKE '".$star.$split_search[$i].$star."' or `full` LIKE '".$star.$split_search[$i].$star."')";
$and = " AND ";

}

us1234
شنبه 31 تیر 1391, 11:08 صبح
شما وقتی کوئری را توی phpMyAdmin به صورت دستی هم اجرا میکنید هنگ میکنه ؟

tehro0n
شنبه 31 تیر 1391, 13:12 عصر
where معمولی که دیگه هیچی 5 نفر پشت سر هم سرچ بزنن سرور می خوابه این کوئری برای اینکه صفحه ها رو که کلیک کردن دوباره از اول سرچ نکنه زدم ولی جواب نداد عجیبه خیلی از جاها کدها رو دیدم یا ساب کوئری یا جوینه سرعت بالایی سرچ می کنه و فچ می آره نشون می ده این تو دو تا فیلد که مشخص هم کردم سیستم هم mysql هست با ه کلاس ساده تو دیتابیس کوئری می زنیم که اصلا چیز اضافی لود نداشته باشه.
ایندکس گذاری هم اگر چیز خوبی در نظر دارید بفرمایید ممنون میشم
query$ این همون کوئری سرچ هست شاید هم این مشکل داره

$star = '%';
$query = '';
$and='';
$split_search = array();
$split_search = split(" ",$_GET['p']);
for ($i = 0;$i < count($split_search); $i++)
{
$query .= $and."(`title` LIKE '".$star.$split_search[$i].$star."' or `text` LIKE '".$star.$split_search[$i].$star."' or `full` LIKE '".$star.$split_search[$i].$star."')";
$and = " AND ";

}
من نمی دونم شما چی می خواهید چون هر دفعه یک تیکه کد میگذارید اون هم ناقص!
در سایت رسمی آموزش php گفته شده که MySqli خیلی بهینه تر از MySql انجام میشه و یواش یواش داره صفحات آموزش قدیم رو می بنده
در این مورد هم هیچ وقت یک کوئری رو در حلقه نگذارید، اگه تعداد ردیف می خواهید از LIMIT استفاده کنید
و اینکه حتما where رو برای چیزهایی که هستند بگذارید که محدود بشه، مثل از این زمان تا این زمان یا آی دی یا نام کاربری و ..

mahdi_1986
یک شنبه 01 مرداد 1391, 11:19 صبح
با سلام

من در ديتا بيسي با حدود 20 ميليون ركورد از روش زير استفاده كردم:

1- ابتدا ID را فراخواني مي‌كردم
2- جستجو را بر حسب ID انجام مي‌دهم.

فرق بدون استفاده و استفاده از روش بالا حدود 45 ثانيه بود.

AbiriAmir
یک شنبه 01 مرداد 1391, 17:33 عصر
چرا باید این query سریعتر از where جواب بده؟
where رو برای همین کار گذاشتن دیگه... Join کردن که زمان بیشتری میبره...
Join کردن ربطی به این نداره که هربار لود نشه...
شما ساختار دیتابیستون، ایندکس ها و تعداد رکورد ها و کوئری کاملتون رو بفرمایید تا بشه بررسی کرد

این کد دومی چه ربطی به کوئری پست 1 داشت؟
این که کلا 1 چیز دیگست...

us1234
دوشنبه 02 مرداد 1391, 00:30 صبح
چرا باید این query سریعتر از where جواب بده؟
where رو برای همین کار گذاشتن دیگه... Join کردن که زمان بیشتری میبره...
Join کردن ربطی به این نداره که هربار لود نشه...
شما ساختار دیتابیستون، ایندکس ها و تعداد رکورد ها و کوئری کاملتون رو بفرمایید تا بشه بررسی کرد

این کد دومی چه ربطی به کوئری پست 1 داشت؟
این که کلا 1 چیز دیگست...

$query که توی کوئری اول تو این کد دوم که داده ساخته شده .