PDA

View Full Version : سوال: چرا وقتی تعداد رکوردهای جدول به بالا 100 هزار تا می رسه سایتم کند می شه؟



idocsidocs
یک شنبه 06 شهریور 1390, 18:45 عصر
من یه جدول با 150 هزارتا رکورد ایجاد کردم که برای خوندن 25 تا کوئری 3 ثانیه طول می کشید !

من ستونهای مورد نیاز رو ایندکس کردم، نوع جدولم myisam و کلکشن utf8_unicode_ci استفاده می کنم.

وقتی سایت رو از طریق کنترل پنلی که نوشتم اجرا می کنم، خوندن 30 تا از این 150 هزار رکورد و نمایششون توی سایت 3 ثانیه طول می کشه ولی phpmyadmin همین رکوردها رو توی 2 دهم ثانیه می خونه و نمایش می ده.

بنظرتون مشکل کند اجرا شدن کوئریها از جدولی هست که من طراحی کردم (phpmyadmin هم همین جدول رو استفاده می کنه) یا اینکه مشکل از کوئری هایی هست که می نویسم؟

توی دیتابیس فقط متن ساده گذاشتم.
کوری به شکل زیر هست:


$sql="select * from table where (type='paper' && sender='admin') order by id desc limit 25000, 25";

توی جدول ستون id کلید اولیه هست، ستونهای type و sender هم ایندکس هستن.

بنظرتون مشکل چیه؟

mlf_mlv
دوشنبه 07 شهریور 1390, 05:00 صبح
خوب باید سورس رو ببینیم که بگیم....

amin1softco
دوشنبه 07 شهریور 1390, 09:49 صبح
شاید مثلاً رکورد عکس گذاشتی و با select * فراخوانی می کنی باید کوئری رو دید....

idocsidocs
دوشنبه 07 شهریور 1390, 11:02 صبح
شاید مثلاً رکورد عکس گذاشتی و با select * فراخوانی می کنی باید کوئری رو دید....
توی دیتابیس فقط متن ساده گذاشتم.
کوری به شکل زیر هست:


$sql="select * from table where (type='paper' && sender='admin') order by id desc limit 25000, 25";

توی جدول ستون id کلید اولیه هست، ستونهای type و sender هم ایندکس هستن.

حالا بنظرتون مشکل چیه؟

idocsidocs
دوشنبه 07 شهریور 1390, 11:03 صبح
خوب باید سورس رو ببینیم که بگیم....
توی دیتابیس فقط متن ساده گذاشتم.
کوری به شکل زیر هست:


$sql="select * from table where (type='paper' && sender='admin') order by id desc limit 25000, 25";

توی جدول ستون id کلید اولیه هست، ستونهای type و sender هم ایندکس هستن.

حالا بنظرتون مشکل چیه؟

idocsidocs
دوشنبه 07 شهریور 1390, 20:00 عصر
دوستان نظری ندارین؟

binyaft
دوشنبه 07 شهریور 1390, 20:05 عصر
اون phpmyadmin رکورد ها رو فقط

SELECT * FROM `tbl_name`
میکنه ؟ یا شما همون Query رو میدی بهش ؟

idocsidocs
دوشنبه 07 شهریور 1390, 22:28 عصر
اون phpmyadmin رکورد ها رو فقط

SELECT * FROM `tbl_name`
میکنه ؟ یا شما همون Query رو میدی بهش ؟

فرقی نمی کنه یبار هم کوئری خود phpmyadmin رو اجرا کردم ولی بازهم اختلاف زیادی در زمان اجرا وجود داشت.

amin1softco
دوشنبه 07 شهریور 1390, 23:33 عصر
خوب عزیز دلم phpmyadmin از LIMIT 0 , 30 استفاده می کنه یا select top 30 همه رکوردا رو که ردیف نمی کنه....

idocsidocs
سه شنبه 08 شهریور 1390, 00:40 صبح
خوب عزیز دلم phpmyadmin از LIMIT 0 , 30 استفاده می کنه یا select top 30 همه رکوردا رو که ردیف نمی کنه....

اگه بخواید ردیفهای 200000 تا 200030 رو ببینید چی؟ بازم زود ردیف می شن؟ شما تا حالا دیتابیسی با یک میلیون ردیف رو تست کردید که بدونید زمان اجرای کوئریهایی که خودتون می نویسید چقدر هست؟ لطفا در این مورد توضیح بدید.

amin1softco
سه شنبه 08 شهریور 1390, 00:46 صبح
من با 1000 تا تست کردم کراس جوینش حدود 1 دقیقه تو mssql طول می کشید
خوب می نویسیم LIMIT 200000 , 30

idocsidocs
سه شنبه 08 شهریور 1390, 02:23 صبح
من با 1000 تا تست کردم کراس جوینش حدود 1 دقیقه تو mssql طول می کشید
خوب می نویسیم LIMIT 200000 , 200030
به نوشتن این کد ساده هست ولی آیا اجرای این اسکریپت به سرعت و کمتر از یک ثانیه اجرا می شه؟

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

amin1softco
سه شنبه 08 شهریور 1390, 11:40 صبح
من با 300 هزار تا رکورد تست کردم خیلی سریع جوب رو گرفتم :
فقط limit نحوش ایجوریه اول باید بنویسی کجای جدول و بعد تعداد سطر هایی که می خواهید برگردونه چیه مثلاً

LIMIT شروع اولین رکورد, تعداد سطرهایی که باید برگردانده شود


SELECT * FROM `mytbl` LIMIT 282060, 100

binyaft
سه شنبه 08 شهریور 1390, 11:44 صبح
وقتی مینویسی 150000,30 یعنی برنامه باید اول 150000 تا رکورد رو با اون شرطی که شما بهش دادی چک کنه و بعد برسه به 150000+1 و نشون بده ، طبیعی هست که باید طول بکشه ...

amin1softco
سه شنبه 08 شهریور 1390, 12:12 عصر
سوال این بود که سرعت این دو محیط چرا متفاوته؟
ولی خداییش فرقی نداره من این کد رو هم تست کردم خیلی سریع جواب داد

SELECT * FROM `mytbl` where name like '%1%' order by id desc limit 25000, 25

idocsidocs
سه شنبه 08 شهریور 1390, 16:04 عصر
من با 300 هزار تا رکورد تست کردم خیلی سریع جوب رو گرفتم :
فقط limit نحوش ایجوریه اول باید بنویسی کجای جدول و بعد تعداد سطر هایی که می خواهید برگردونه چیه مثلاً

LIMIT شروع اولین رکورد, تعداد سطرهایی که باید برگردانده شود


SELECT * FROM `mytbl` LIMIT 282060, 100


می شه دقیقا بگید اجرا و نمایش کوئری تون چند دهم ثانیه طول کشید؟ سایر دوستان هم اگه می شه زحمت بکشن و زمان دقیق اجرای یه کوئری با شرط where توی دیتابیشون رو اعلام کنن.

amin1softco
پنج شنبه 10 شهریور 1390, 13:11 عصر
time=0.430416


$starttime = microtime();
$sql = 'SELECT * FROM `mytbl` where name like \'%1%\' order by id desc limit 25000, 25';
$result=mysql_query($sql);
$endtime = microtime();
while($row = mysql_fetch_array($result))
{
..............
}echo "time=".(float)($starttime - $endtime)."<br>";

idocsidocs
پنج شنبه 10 شهریور 1390, 14:04 عصر
time=0.765628


$starttime = microtime();
$sql = 'SELECT * FROM `mytbl` where name like \'%1%\' order by id desc limit 25000, 25';
$result=mysql_query($sql);
$endtime = microtime();
while($row = mysql_fetch_array($result))
{
..............
}echo "time=".(float)($starttime - $createuser)."<br>";

می شه بگید نوع ستونهای id و name چی هست؟

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

amin1softco
پنج شنبه 10 شهریور 1390, 14:25 عصر
آی دی int(10)
name varchar(100)
خوب وظیفه پایگاه همینه دیگه باید همینا رو مدیریت کنه
در ضمن شرطی برای سلکت سایت ها خبری نمی گذارند به ترتیب از آخرین خبر می خونند تا صفحه پر بشه
برای جستجو هم بیشتر اوقات از گوگل استفاده می کنند نه کوئری دیتا بیس

idocsidocs
پنج شنبه 10 شهریور 1390, 15:46 عصر
آی دی int(10)
name varchar(100)
خوب وظیفه پایگاه همینه دیگه باید همینا رو مدیریت کنه
در ضمن شرطی برای سلکت سایت ها خبری نمی گذارند به ترتیب از آخرین خبر می خونند تا صفحه پر بشه
برای جستجو هم بیشتر اوقات از گوگل استفاده می کنند نه کوئری دیتا بیس
اشتباه گفتم، منظورم این بود که کدومشون ایندکس شدن و چه نوع ایندکسی هستن؟

برای سرچ کردن شما درست می گید، ولی وقتی یه پایگاه خبری 1 میلیون خبر توی سایتش داشته باشه و مدیر بخواد خبرهای ماهها یا سالهای قبل رو که خودش ارسال کرده رو ببینه، باید یه کوئری که شامل شرطهای مختلف به همراه limit استفاده کنه. در این شرایط آیا سرعت سایت پایین نمی یاد؟

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

این فرومها که مرتب آپدیت می شن چطور و به کمک چه روشی مطالب رو با سرعت دسته بندی و نمایش می دن؟