PDA

View Full Version : سوال: سریعترین کوئری گرفتن با mysqli_query است؟



tehro0n
چهارشنبه 14 تیر 1391, 16:27 عصر
قسمتی از سایت من دارای query های زیاد است که با بازدید زیاد خیلی RAM و CPU سرورم رو می گیره
جدیدا دارم کاری می کنم که تمام Select ها رو که نزدیک به 60 فیلد می باشد رو در متغیر بریزم و آنچه را که کاربر انتخاب کرده رو نمایش بده و دیگه با خواسته های مختلف کاربران کوئری های متفاوت چند بار گرفته نشه

آیا این کار درسته؟ اینجوری ممکن است حدود 40 فیلد کاربرد نداشته باشه ولی در ازا یکبار کوئری گرفته میشه!
نوع جدول بندی رو چطور انجام بدم؟ و مانعی نیست اگه 60 فیلد در یک جدول باشه ؟ یا اینکه چند جدول کنم و موقع کوئری گرفتن جداول مختلف رو با یک کوئری صدا بزنم؟

و سئوال اصلی اینه که چون بازدید زیاد است سریع ترین روش دسترسی به mySql کدام است؟
همان یکبار کوئری معمولی صدا بزنم کافیه یا از mysqli_query یا ezSql استفاده کنم؟
ممنون

tehro0n
جمعه 16 تیر 1391, 02:48 صبح
کسی نمی دونست؟
مدیریت شما چی؟

plague
جمعه 16 تیر 1391, 09:50 صبح
این سوالایی که پرسیدی همشون مربوط به نوع پروژت میشه و نمیشه چشم بسته جواب داد


جدیدا دارم کاری می کنم که تمام Select ها رو که نزدیک به 60 فیلد می باشد رو در متغیر بریزم و آنچه را که کاربر انتخاب کرده رو نمایش بده و دیگه با خواسته های مختلف کاربران کوئری های متفاوت چند بار گرفته نشه


ایده خوبی نیست شما میتونید از کش کردن کوئری استفاده کنید برای بالا بردن سرعت نه اینکه همه رو بگیرید به قول خودتون توی متغییر بریزید
البته بازم میگم این برمیگرده به اپلیکیشنتون میتونید زمان بگیرید ببینید کدوم روش کمتر وقت میبره
در ضمن من متوجه نمیشم 60 تا فیلد یعنی چی ؟ ما سطر داریم و ستون

در مورد سوال دومتون هم من نمیدونم منظورتون از فیلد چیه و لی ستون بهتره که زیره 100 عدد باشه سطر هم مهم نیست
همه رو هم توی یک جدول بزار

زمان دسترسی به mysql هم فرقی نمیکنه مگه میخاد بره مسافرت ؟ اگه نگران سرعت هستی سعی کن کوئریتو درست و بهینه بنویسی

tehro0n
جمعه 16 تیر 1391, 19:00 عصر
منظور از فیلد همون ستون شماست
در اصل من برای آمارگیر دارم این رو می نویسم، چیزی مثل وبگذر رو در نظر بگیرید که 7000 کاربر دارن از این سرویس استفاده می کنند، هر بار که اسکریپت لود میشه یک سطر اضافه میشه که شامل اطلاعات کاربره
حالا برای نمایش بازدید امروز بر اساس زمان بازدیدهای امروز رو میشماره و اگه بازدید دیروز و کاربران و بازدید ماهانه رو بخواد باید دوباره count(*) کنه
خوب این برای چنین کاربرای زیادی که خودشون هم حداقل 100 بازدید دارن خیلی سنگینه
پس 30 فیلد یا ستون بازدید امروز و .. در جدول گذاشتم، که برای خواندن همه اینا فقط کوئری گرفته بشه و بر حسب زمان شمارش نشه
چند جدول دیگر را نیز همه با همین کوئری گرفته میشن که بر اساس نیاز کاربر نمایش داده بشن
بعضی بازدیدها رو هم می خوام با استفاده از کوکی در کامپیوتر کاربران ذخیره کنم که از آن جا بخوانند، بازدید هایی که تغییر نمی کنند مثلا ماه گذشته

حالا متوجه شدید که که mySql هم می ره مسافرت؟

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

plague
شنبه 17 تیر 1391, 08:16 صبح
7000 تا که چیزی نیست سرعت MYSQL خیلی بیشتر از این حرفاست من با چند صد هزار تا کاربر کار میکنم


حالا برای نمایش بازدید امروز بر اساس زمان بازدیدهای امروز رو میشماره و اگه بازدید دیروز و کاربران و بازدید ماهانه رو بخواد باید دوباره count(*) کنهبرای اپلیکیشن هایی در حجم بالا مثل وبگزر با استفاده از نرمال سازی و تیبل های کش میان اپلیکیشن رو از انجام چنین عملیاتی بی نیاز میکنن من یه مثال سریع میزنم که متوجه ایده کار بشید
شما دوتا تیبل میسازی به اسم archive و daily_visit
اولی دوتا فیلد داره date_id (A_I) , date
دومی 4 تا فیلد site_id , date_id , visit_counter

به ازای هر بازدید کننده ای که برای سایتی ثبت میشه
تیبل archive چک میشه و درصورت وجود تاریخ امروز آیدیش گرفته میشه
در صورت نبودن تاریخ امروز , تاریخ امروز ثبت میشه و بعد آیدیش گرفته میشه که همون date_id هستش

در تیبل دوم نگاه میکنیم برای آیدی تاریخ امروز و آیدی سایت فعلی که ویزیتور داشته رکوردی ثبت شده یا نه
اگه رکوردی نبود آیدی تاریخ امروز رو که از تیبل اول گرفتیم به علاوه آیدی اون سایت و 1 به عنوان visit_ccount میزاریم اون تو
اگر هم از قبل موجود بود که فقط یدونه visit_count v, افزایش میدیم

حالا اگه سایتی خواست تعداد بازدید های یک تاریخش رو ببینه کافیه که از تیبل آرشیو تاریخ مورد نظر رو در بیاری و join کنی با تیبل daily_visit
شاید به نظرتون کمی کار اضافه بیاد ولی فکرش رو بکنید که وقتی چند صد هزار تا بازدید کننده باشید چقدر سریع میتونی بازدید های روزانه رو بگیرید



برای زمان گرفتن هم قبل از اجرای کد زمان موجود رو میگیری و بعد از پایان کد هم زمان رو میگیری و این دو رو از هم کم میکنی

tehro0n
شنبه 17 تیر 1391, 14:32 عصر
7000 تا که چیزی نیست سرعت MYSQL خیلی بیشتر از این حرفاست من با چند صد هزار تا کاربر کار میکنم

خوب 7000 تا کاربر هم اگه حداقل روزی 100 بازدید داشته باشند میشه حداقل روزی 700000 استفاده از این ابزار!

این موردی هم که شما فرمودید برای آمارگیرهایی که تنها نمایش بازدید را نشان می دهند خوبه
البته قسمتی از این بررسی را در کدهای جدید که مربوط به همان نمایش بازدید روزها است انجام میدم

اما این ابزار باید مرورگر + سیستم عامل + رزولوشن و .. هم ثبت کنه که باید برای هر بازدید یک insert داشته باشیم

البته چون این آمارها در صفحه سایت کاربر نمایش داده نمیشه دیگه برای اینها ستون یا فیلد جدا نذاشتم، و از همان count ردیف ها استفاده می کنم

tehro0n
پنج شنبه 22 تیر 1391, 12:16 عصر
7000 تا که چیزی نیست سرعت MYSQL خیلی بیشتر از این حرفاست من با چند صد هزار تا کاربر کار میکنم

برای اپلیکیشن هایی در حجم بالا مثل وبگزر با استفاده از نرمال سازی و تیبل های کش میان اپلیکیشن رو از انجام چنین عملیاتی بی نیاز میکنن من یه مثال سریع میزنم که متوجه ایده کار بشید
شما دوتا تیبل میسازی به اسم archive و daily_visit
اولی دوتا فیلد داره date_id (A_I) , date
دومی 4 تا فیلد site_id , date_id , visit_counter

به ازای هر بازدید کننده ای که برای سایتی ثبت میشه
تیبل archive چک میشه و درصورت وجود تاریخ امروز آیدیش گرفته میشه
در صورت نبودن تاریخ امروز , تاریخ امروز ثبت میشه و بعد آیدیش گرفته میشه که همون date_id هستش

در تیبل دوم نگاه میکنیم برای آیدی تاریخ امروز و آیدی سایت فعلی که ویزیتور داشته رکوردی ثبت شده یا نه
اگه رکوردی نبود آیدی تاریخ امروز رو که از تیبل اول گرفتیم به علاوه آیدی اون سایت و 1 به عنوان visit_ccount میزاریم اون تو
اگر هم از قبل موجود بود که فقط یدونه visit_count v, افزایش میدیم

حالا اگه سایتی خواست تعداد بازدید های یک تاریخش رو ببینه کافیه که از تیبل آرشیو تاریخ مورد نظر رو در بیاری و join کنی با تیبل daily_visit
شاید به نظرتون کمی کار اضافه بیاد ولی فکرش رو بکنید که وقتی چند صد هزار تا بازدید کننده باشید چقدر سریع میتونی بازدید های روزانه رو بگیرید



برای زمان گرفتن هم قبل از اجرای کد زمان موجود رو میگیری و بعد از پایان کد هم زمان رو میگیری و این دو رو از هم کم میکنی

این برای بازدیدهای روزانه خوبه، ولی وقتی بخواهیم بازدید کاربران رو که با ip باید به دست بیاریم رو محاسبه کنیم چی ؟
این چیزی که می گید برای ابزار های ساده آمارگیر هست که آمار امروز و دیروز رو فقط نمایش می ده :لبخند: