PDA

View Full Version : سوال: کسی تا حالا زمان اجرای یه کوئری روی جدولی که بالای 1 میلیون ردیف داشته باشه رو تست کرده؟



idocsidocs
یک شنبه 20 شهریور 1390, 10:25 صبح
کسی تا حالا زمان اجرای یه کوئری روی جدولی که بالای 1 میلیون ردیف داشته باشه رو تست کرده؟

لطفا نتیجه تست رو اعلام کنید.

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

sattaryekta
یک شنبه 20 شهریور 1390, 13:54 عصر
سلام

به جز تعداد رکوردها و کوئری
زمان اجرا را قدرت سرور تعیین میکنه
میزان حافظه
قدرت CPU
در مراحل بعدی:
نوع جدول myisam یا innodb
تنظیمات سرور مثل تعداد پروسه های مجاز در یک واحد زمانی - تعدا کانکشن های مجاز از یک آی پی

به نظر من مهتمترین تأثیر را قدرت Server داره

idocsidocs
یک شنبه 20 شهریور 1390, 19:25 عصر
به جز تعداد رکوردها و کوئری
زمان اجرا را قدرت سرور تعیین میکنه
میزان حافظه
قدرت CPU
در مراحل بعدی:
نوع جدول myisam یا innodb
تنظیمات سرور مثل تعداد پروسه های مجاز در یک واحد زمانی - تعدا کانکشن های مجاز از یک آی پی

به نظر من مهتمترین تأثیر را قدرت Server داره با 150 هزار ردیف، روی لوکال هاست سرعت من خیلی پایینه، اگه همین تعداد ردیف رو توی سرور ایجاد کنم ممکنه که سرعت بالا بره؟

armsoftpc
یک شنبه 20 شهریور 1390, 20:38 عصر
به نام خدا
با سلام
اگر امکان داره تفاوت ها و ویژگی های موتورهای مختلف ذخیره سازی رو بیان کنید.مخصوصا نوع myisam و InnoDB.
همانطور که میدانید زمانی که جداول InnoDB را بهینه سازی (optimize) میکنیم، ستون هایی که از نوع auto_increment باشند و بین چند رکورد فاصله عددی باشد ، اون رو بهینه سازی می کنه.حالا سوال این جاست که چه راهی است این قابلیت در myisam هم کارکند. چون سرعت myisam خیلی بیش تر از InnoDB است.
مثال هم برای تفهیم بیش تر پست:لبخندساده::فرض کنید 2 رکورد در جدول درج می کنید و و رکورد دوم را نیز پاک می کنید ، اگر جدول بهینه نشده باشد دوباره که رکورد جدید درج می کنید شماره ID به جای این که از 2 شروع شود از 3 شروع می شود ، در نوع InnoDB این مشکل با بهینه سازی جدول حل می شود ، اما در MyIsam این گونه نیست.اکنون باید چه کارکرد که هم سرعت را داشت و هم جلوگیری از افزایش بی رویه ID رکورد ها.:متفکر:
با تشکر.

idocsidocs
یک شنبه 20 شهریور 1390, 20:47 عصر
اگر امکان داره تفاوت ها و ویژگی های موتورهای مختلف ذخیره سازی رو بیان کنید.مخصوصا نوع myisam و InnoDB.
همانطور که میدانید زمانی که جداول InnoDB را بهینه سازی (optimize) میکنیم، ستون هایی که از نوع auto_increment باشند و بین چند رکورد فاصله عددی باشد ، اون رو بهینه سازی می کنه.حالا سوال این جاست که چه راهی است این قابلیت در myisam هم کارکند. چون سرعت myisam خیلی بیش تر از InnoDB است.
مثال هم برای تفهیم بیش تر پست:لبخندساده::فرض کنید 2 رکورد در جدول درج می کنید و و رکورد دوم را نیز پاک می کنید ، اگر جدول بهینه نشده باشد دوباره که رکورد جدید درج می کنید شماره ID به جای این که از 2 شروع شود از 3 شروع می شود ، در نوع InnoDB این مشکل با بهینه سازی جدول حل می شود ، اما در MyIsam این گونه نیست.اکنون باید چه کارکرد که هم سرعت را داشت و هم جلوگیری از افزایش بی رویه ID رکورد ها.:متفکر:
برای مقالات سایت این روش مناسب نیست. چون لینک یه مقاله توسط همین ستونهای auto_increment بدست می یاد و اگه تغییر کنه هم توی کوتورهای جستجو با مشکل بر می خوریم و هم ممکنه کاربری لینک مقاله رو ذخیره کرده باشه !

اگر بخوایم آی دی مقالات رو توی ستونهای دیگه ای قرار بدیم، بار اضافه ایجاد کردیم.

armsoftpc
یک شنبه 20 شهریور 1390, 21:02 عصر
میشه واضح تر توضیح بدید ، دوستان دیگه هم نظرشون رو اعلام کنند.

idocsidocs
یک شنبه 20 شهریور 1390, 21:39 عصر
میشه واضح تر توضیح بدید ، دوستان دیگه هم نظرشون رو اعلام کنند.


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

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

binyaft
دوشنبه 21 شهریور 1390, 10:47 صبح
کسی تا حالا زمان اجرای یه کوئری روی جدولی که بالای 1 میلیون ردیف داشته باشه رو تست کرده؟

لطفا نتیجه تست رو اعلام کنید.

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

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

اومدی پرسیدی یک میلیون رکورد چقد زمان میبره ؟
خب رو PC ــه شما ممکنه 10 دقیقه
خب رو PC من ممکنه 1 ساعت
رو سرور ممکنه 0.001 ثانیه !

برادر من بستگی به سرور داره!
البته اگر تعیین میکردی کوئری رو و میخواستی ببینی که کوئری Optimize میشه یا نه بحث فرق میکرد! شاید شما یه طور کوئری بنویسی که 0.1 طول بکشه ، بنده همون کوئری رو بنویسم 0.2 ثانیه طول بکشه ....

لطفا قبل از سوال کردن یه ذره ببینید چی میپرسید .

پ.ن : Mysql اگه بخواد با یک میلیون رکورد از کار بیافته و جواب نده Mysql نیست ! فایل txt هست .

idocsidocs
دوشنبه 21 شهریور 1390, 11:34 صبح
البته اگر تعیین میکردی کوئری رو و میخواستی ببینی که کوئری Optimize میشه یا نه بحث فرق میکرد! شاید شما یه طور کوئری بنویسی که 0.1 طول بکشه ، بنده همون کوئری رو بنویسم 0.2 ثانیه طول بکشه ....
کد کوئریم رو در ادامه قرار دادم:

$sql="select `s1`, `s2`, `s3` from `tb1` where (`sender`='admin' && `type`='paper') limit 250000 25 "
با فرض بر اینکه ستونهای type و sender ایندکس هستن، و توی جدول حداقل 10 مگابایت اطلاعات وجود داره، لطفا این کوئری رو Optimize کنید ببینم چطور Optimize می شه.

binyaft
دوشنبه 21 شهریور 1390, 12:10 عصر
کد کوئریم رو در ادامه قرار دادم:

$sql="select `s1`, `s2`, `s3` from `tb1` where (`sender`='admin' && `type`='paper') limit 250000 25 "
با فرض بر اینکه ستونهای type و sender ایندکس هستن، و توی جدول حداقل 10 مگابایت اطلاعات وجود داره، لطفا این کوئری رو Optimize کنید ببینم چطور Optimize می شه.
خب منم از این بهتر بلد نیستم بنویسم ، وقتی رو PC ــه شما خیلی طول میکشه ، ضعیفه خب !

idocsidocs
دوشنبه 21 شهریور 1390, 12:41 عصر
خب منم از این بهتر بلد نیستم بنویسم ، وقتی رو PC ــه شما خیلی طول میکشه ، ضعیفه خب ! کوئری که خوبه و مشکلی نداره.
ایندکس هم کردم، پس چرا روی سیستم من طول می کشه؟

binyaft
دوشنبه 21 شهریور 1390, 16:06 عصر
کوئری که خوبه و مشکلی نداره.
ایندکس هم کردم، پس چرا روی سیستم من طول می کشه؟

جوابش تابلو ـــه ، سرور Mysql منابع سیستم بیشتری میخواد

idocsidocs
دوشنبه 21 شهریور 1390, 16:35 عصر
جوابش تابلو ـــه ، سرور Mysql منابع سیستم بیشتری میخواد یعنی منظورتون اینه که حتی هاستهای اشتراکی هم قدرت پردازش بالاتری نسبت به سیستمهای خانگی دارن؟

binyaft
دوشنبه 21 شهریور 1390, 18:45 عصر
باز هم بستگی داره ...
سرور مشخصاتش چی باشه
چند تا سایت روش باشن
و...

idocsidocs
دوشنبه 21 شهریور 1390, 19:04 عصر
باز هم بستگی داره ...
سرور مشخصاتش چی باشه
چند تا سایت روش باشن
و... در حالت عادی اگر از یه سرور اشتراکی متوسط استفاده کنیم و حجم دیتابیس حداقل 50 مگ باشه، کوئری ها در چه مدت زمانی اجرا می شن؟

binyaft
دوشنبه 21 شهریور 1390, 20:16 عصر
بستگی داره کوئری رو چطور نوشته باشین !
مثلا where , limit سرعت رو میارن پایین !

Keramatifar
دوشنبه 21 شهریور 1390, 20:23 عصر
این مدت زمان برای کوئری اصلا طبیعی نیست، لطفا structure کامل جدول رو اینجا قرار بدهید تا بررسی شود

idocsidocs
دوشنبه 21 شهریور 1390, 22:57 عصر
این مدت زمان برای کوئری اصلا طبیعی نیست، لطفا structure کامل جدول رو اینجا قرار بدهید تا بررسی شود
کدهای مربوط به ایجاد جدول رو در ادامه قرار دادم:
اگر توی این جدول که مربوط به ذخیره مقالات سایت هست اگر 150 هزارتا ردیف ذخیره بشه، سرعت اجرای کوئری به 2 تا 3 ثانیه می رسه که خیلی سرعت بدی هست. لطفا راهنماییم کنید.



CREATE TABLE IF NOT EXISTS `ad_sent` (
`num` int(20) unsigned NOT NULL AUTO_INCREMENT,
`admin_id` varchar(16) COLLATE utf8_unicode_ci NOT NULL,
`pTitle` varchar(400) COLLATE utf8_unicode_ci NOT NULL,
`text` longtext COLLATE utf8_unicode_ci NOT NULL,
`countinue` longtext COLLATE utf8_unicode_ci NOT NULL,
`view_text` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
`showText` varchar(3) COLLATE utf8_unicode_ci NOT NULL,
`scriptPass` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`seotitle` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
`seokey` varchar(2500) COLLATE utf8_unicode_ci NOT NULL,
`seodesc` varchar(2500) COLLATE utf8_unicode_ci NOT NULL,
`textimage` varchar(1000) COLLATE utf8_unicode_ci NOT NULL,
`pSec` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
`pMin` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
`pHou` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
`pDay` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
`pMou` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
`pYear` varchar(4) COLLATE utf8_unicode_ci NOT NULL,
`text_type` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`comments` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
`text_g_r` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
`ad_ok` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
`r_sum` int(10) NOT NULL,
PRIMARY KEY (`num`),
KEY `text_type` (`text_type`(10)),
KEY `admin_id` (`admin_id`),
KEY `text_g_r` (`text_g_r`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC AUTO_INCREMENT=1 ;

arashaliz
شنبه 26 شهریور 1390, 20:23 عصر
سلام

مسئله زمان اجرای کوئری روی pc های مختلف نیست. چون کاملا متغیره
من دیتابیس با 1.5 gig تکست فارسی رو تو 4 ثانیه query میزنم با کد خودم ولی mysql زیر 1 ثانیه
core 2 due 1 gig ram

A B C D
شنبه 26 شهریور 1390, 20:36 عصر
شاید چون PHP باید نتایج رو بگیره و در حافظهء خودش ذخیره کنه درواقع این سرعت این کارهای PHP هست که پایینه. احتمالا حجم نتایج برگشت داده شده زیاده. حتی ممکنه این نتایج بخاطر محدودیت حافظهء سیستم شما در حافظهء مجازی (دیسک سخت) ذخیره بشن که این سرعت رو خیلی پایین میاره.
یه تابعی هست بنام mysql_unbuffered_query که کوئری رو اجرا میکنه اما نتایج رو از mysql دریافت و ذخیره نمیکنه.
اگر از این روش استفاده کنید شاید سرعتتون زیاد بشه.

این توضیح منوال هم جالبه:

On the one hand, this saves a considerable amount of memory with SQL queries that produce large result sets. On the other hand, you can start working on the result set immediately after the first row has been retrieved: you don't have to wait until the complete SQL query has been performed.

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

idocsidocs
شنبه 26 شهریور 1390, 20:56 عصر
مسئله زمان اجرای کوئری روی pc های مختلف نیست. چون کاملا متغیره
من دیتابیس با 1.5 gig تکست فارسی رو تو 4 ثانیه query میزنم با کد خودم ولی mysql زیر 1 ثانیه
core 2 due 1 gig ramمنظورتون اینه که زمان اجرای کوئری روی سرور زیر یک ثانیه زمان می بره؟


شاید چون PHP باید نتایج رو بگیره و در حافظهء خودش ذخیره کنه درواقع این سرعت این کارهای PHP هست که پایینه. احتمالا حجم نتایج برگشت داده شده زیاده. حتی ممکنه این نتایج بخاطر محدودیت حافظهء سیستم شما در حافظهء مجازی (دیسک سخت) ذخیره بشن که این سرعت رو خیلی پایین میاره.
یه تابعی هست بنام mysql_unbuffered_query که کوئری رو اجرا میکنه اما نتایج رو از mysql دریافت و ذخیره نمیکنه.
اگر از این روش استفاده کنید شاید سرعتتون زیاد بشه.واقعا این روش می تونه تاثیر گذار باشه. چون توی خیلی از کوئری ها فقط لازمه که وجود یه سطر چک بشه، یا تعداد ردیف های جدول محاسبه بشه و نیازی به نتیجه نداریم.

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

A B C D
شنبه 26 شهریور 1390, 21:04 عصر
پی اچ پی نتایج رو بعد از فتچ کردن از حافظه پاک می کنه یا اینکه تا انتهای اسکریپت نتایج رو حفظ می کنه؟
قاعدتا PHP نتایج رو تاوقتیکه شما خودتون بوسیلهء تابع mysql_free_result اونا رو آزاد نکردید نگه میداره. چون ممکنه بعدا دوباره بخواید از اون نتایج استفاده کنید و با توابعی مثل mysql_data_seek میشه دوباره به سطرهای قبلی که خونده شدن برگشت.
البته اگر ارجاعی که به این نتایج هست از بین بره احتمالا سیستم GC خودش حافظهء اختصاص داده شده به نتایج رو آزاد میکنه.
منظورم از ارجاع متغییری هست که نتایج رو بهش اختصاص دادید.

idocsidocs
شنبه 26 شهریور 1390, 23:30 عصر
قاعدتا PHP نتایج رو تاوقتیکه شما خودتون بوسیلهء تابع mysql_free_result اونا رو آزاد نکردید نگه میداره. چون ممکنه بعدا دوباره بخواید از اون نتایج استفاده کنید و با توابعی مثل mysql_data_seek میشه دوباره به سطرهای قبلی که خونده شدن برگشت.
البته اگر ارجاعی که به این نتایج هست از بین بره احتمالا سیستم GC خودش حافظهء اختصاص داده شده به نتایج رو آزاد میکنه.
منظورم از ارجاع متغییری هست که نتایج رو بهش اختصاص دادید.

قاعدتا PHP نتایج رو تاوقتیکه شما خودتون بوسیلهء تابع mysql_free_result اونا رو آزاد نکردید نگه میداره.منظورتون اینه که اگه چندبار یه کوئری یکسان زده بشه، پی اچ پی فقط کوئری اول رو اجرا می کنه؟

armsoftpc
یک شنبه 27 شهریور 1390, 13:37 عصر
به نام خدا
با سلام

منظورتون اینه که اگه چندبار یه کوئری یکسان زده بشه، پی اچ پی فقط کوئری اول رو اجرا می کنه؟ به نظر من خیر! هر کوئری که زده بشه، یه بار اجرا میشه ، میتونید امتحان کنید.
حالا اگه از این بحث ها بگذریم ، مدیران انجمن میتونند بگند چرا سایت برنامه نویس به این همه تاپیک و کاربر مشکل در سرعت ندارد!
آیا نوع موتور ذخیره سازی جداولتان MyIsam است، چون خود ویبولتین به صورت پیش فرض نوع موتور را InnoDB در نظر میگیرد! همون طور که میدونید سرعت نوع InnoDB بسیار کم تر از MyIsam و حجم InnoDB بیش تر از MyIsam ، آیا با این تفاسیر عاقلانه است که از نوع InnoDB استفاده شود.
لطفا توضیح کاملی در مورد دیتابیس برنامه نویس دهید.:قلب:
موفق باشید.

armsoftpc
سه شنبه 29 شهریور 1390, 19:30 عصر
به نام خدا
با سلام
مدیران انجمن نظری ندارند و نمی خوان به سوال پاسخ بدهند.

binyaft
سه شنبه 29 شهریور 1390, 20:08 عصر
به نام خدا
با سلام
مدیران انجمن نظری ندارند و نمی خوان به سوال پاسخ بدهند.
یه گزینه ساخته شده به نام "ایجاد تاپیک جدید"

Keramatifar
چهارشنبه 30 شهریور 1390, 22:28 عصر
توی برنامه نویس مکانیزم های Optimization زیادی استفاده شده تا به این سرعت رسیده
پیشنهاد می کنم شما این مطلب رو مطالعه بفرمائید
http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html

armsoftpc
چهارشنبه 30 شهریور 1390, 23:44 عصر
به نام خدا
با سلام و تشکر از شما

توی برنامه نویس مکانیزم های Optimization زیادی استفاده شده تا به این سرعت رسیدهای کاش می شد ، نام ببرید و توضیحات بیش تری بدید! البته نه در این تاپیک ، بلکه به تاپیک زیر بیایید.
http://barnamenevis.org/showthread.php?306050-%D9%81%D8%B1%D9%88%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-%D8%A8%D8%A7-%D8%A7%DB%8C%D9%86-%D9%87%D9%85%D9%87-%D8%AA%D8%A7%D9%BE%DB%8C%DA%A9-%D9%88-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1-%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%A7%D8%B2-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D8%AE%D9%88%D8%AF-%D9%BE%D8%B4%D8%AA%DB%8C%D8%A8%D8%A7%D9%86-%D9%85%DB%8C-%DA%AF%DB%8C%D8%B1%D8%AF!!!
موفق باشید.

A B C D
پنج شنبه 31 شهریور 1390, 07:43 صبح
منظورتون اینه که اگه چندبار یه کوئری یکسان زده بشه، پی اچ پی فقط کوئری اول رو اجرا می کنه؟
نه ولی نتایج کوئری اولیه همچنان در حافظه باقی میمونن. البته فکر میکنم به شرط اینکه متغییری که result کوئری قبلی رو درش ذخیره کردید سرجاش باقی مونده باشه.

iranaca
شنبه 02 دی 1391, 11:13 صبح
بله دوست عزیز، من در حال مقایسه بین روش SQl query و XML دارم این کارو انچام میدم، به لینک زیر برو و برنامه SQL Sentary رو دانلود کن
http://www.sqlsentry.com/plan-explorer/sql-server-query-view.asp
تو این برنامه میتونی با سرور SQl و نوشتن نام DataBase لاگین کنی و Select, Exec یا هر کوئری دیگه رو بنویسی و زمان اجرای پردازده رو ببینی
منبع: http://stackoverflow.com/questions/11138486/how-to-calculate-the-cpu-time-for-query-execution-or-stored-procedure