PDA

View Full Version : گفتگو: کدام روش بهتر است؟ (پایگاه داده با حجم بالا)



tehro0n
یک شنبه 10 دی 1391, 16:53 عصر
سلام،
من از phpMyAdmin mySql استفاده می کنم، ابزار آمارگیر طراحی کردم که با حجم بالا به مشکل رم برخوردم
می خواستم بدونم کدوم یکی از این دو روش که در زیر توضیح می دم بهتره؟

1- برای ثبت بازدید روزها از 80 ستون که شامل تعداد 30 روز بازدید + 30 روز کاربر + 12 ماه و .. است استفاده کنم، این روش کنونی است که انجام میدم، شما یک رکورد میگیرید که 80 ستون داره و هربار بازدید امروزش update میشه اما بازدید روزها روزی یکبار جابه جا میشن یعنی بازدید امروز میره دیروز و .. برای ماه هم 30 روز یکبار، اینجوری نیازی به count و .. نیست و اینکه می تونم بازدید کل و بیشترین بازدید رو هم همینجا به زور کنم

2- شامل ستونهای بازدید - تاریخ - بازدید کل - بیشترین بازدید که در این روش هر روز یک ردیف اضافه میشه و با تاریخ هایی که داده شده روزهای امروز تا 365 روز قبل رو دارم، در این روش نمیشد بازدید کل رو در همین جدول داشت و مجبورم با همین ستون ها بیشترین بازدید رو هم هر دفعه اضافه کنم، مزیتش تعداد ستون های کمتره اما اگر کسی آمار سال پیش یا ماه های گذشته رو بخواد باید چندین بار کوئری گرفت و count یا sum کرد،
بیشترین بازدید و بازدید کل رو برای این هر دفعه ثبت می کنم چون قراره اطلاعات سال پیش پاک شه تا حجم اطلاعات کمتر شه، خودتون حساب کنید که 100000 کاربر 365 ردیف داشته باشن بهتره تا اینکه این تعداد هر ساله بیشتر شه

اگر روشی بهتر سراغ دارید بفرمایید و یا اینکه کدام یک از این دو روش فشار کمتری رو به سرور میارن
ممنون

mamali-mohammad
یک شنبه 10 دی 1391, 21:29 عصر
دوست عزیز 80 ستون برای بازدید ؟!!!!
مگه میخوای چیکار کنی ؟

wallfa
یک شنبه 10 دی 1391, 21:37 عصر
عزیز به نظر بنده باید یه دوتا سیستم دیگه بررسی کنید !

tehro0n
دوشنبه 11 دی 1391, 00:09 صبح
نوشتم 80 ستون برای چیه دیگه!
من همین جوری کوئری می گیرم هم معلوم نمیشه، باید با گذر زمان مشخص شه، چون در لحظه های مختلف ممکنه بیخودی سرور بخوابه در صورتی که دلیل چیز دیگه ای باشه، می خوام روش اصولی رو انجام بدم چون وقت این که دوباره این همه کد رو بازسازی کنم و تغییر بدم و ببینم اون هم غلطه رو ندارم

Unique
دوشنبه 11 دی 1391, 05:57 صبح
میشه بگین آمار چی را میخواین ثبت کنین ؟ آمار بازدید از سایت ؟ بازدید کاربران عضو ؟ بازدید هر صفحه جدا ؟ چه اطلاعاتی ؟ تعداد بازدید ؟ browser و ip ؟ ، شما خیلی کلی گفتین و عجیب !

SlowCode
دوشنبه 11 دی 1391, 08:06 صبح
سلام
به نظرم روشت اشتباهه، فقط تاریخ بازدید رو با اطلاعاتی که میخوای ثبت ثبت کن. بعد واسه پیدا کردن آمار دیروز با کد نویسی یه روز از تاریخ جاری کم کن، مثلا:

"select count('month') from tbl_viewers where date between '".date("Y,m,1")."' and '".date('Y,m,31')."'"
واسه ماه قبلی هم:

"select count('lastmonth') from tbl_viewers where date between '".date("Y,m",strtotime('-1 month',time()))."' and '".date("Y,m,30",strtotime('-1 month',time()))."'"
اینطوری حجم دیتابیست هم اشغال نمیشه چون با یه فیلد کارت راه می افته.

tehro0n
دوشنبه 11 دی 1391, 11:10 صبح
میشه بگین آمار چی را میخواین ثبت کنین ؟ آمار بازدید از سایت ؟ بازدید کاربران عضو ؟ بازدید هر صفحه جدا ؟ چه اطلاعاتی ؟ تعداد بازدید ؟ browser و ip ؟ ، شما خیلی کلی گفتین و عجیب !

آمارگیر بازدید سایت ها، چیزی مثل وبگذر که البته دارم امکانات بیشتر و دقیق تری رو این چند روزه اضافه می کنم.. همه چی توش هست، منتها این جدول تنها برای بازدیدهاست، چون برای ip و browser ها تنها راه حل insert تک تک یوزر هاست و جدولی جدا می خواد، اما بازدید هارو میشه برای هر روز update کرد و ردیف بعدی بشه بازدید روز بعدی

tehro0n
دوشنبه 11 دی 1391, 11:22 صبح
سلام
به نظرم روشت اشتباهه، فقط تاریخ بازدید رو با اطلاعاتی که میخوای ثبت ثبت کن. بعد واسه پیدا کردن آمار دیروز با کد نویسی یه روز از تاریخ جاری کم کن، مثلا:

"select count('month') from tbl_viewers where date between '".date("Y,m,1")."' and '".date('Y,m,31')."'"
واسه ماه قبلی هم:

"select count('lastmonth') from tbl_viewers where date between '".date("Y,m",strtotime('-1 month',time()))."' and '".date("Y,m,30",strtotime('-1 month',time()))."'"
اینطوری حجم دیتابیست هم اشغال نمیشه چون با یه فیلد کارت راه می افته.

من با روش زمان time() که به صورت INT ذخیره میشه استفاده میکنم، اینجوری مانوورم بیشتره رو زمان، و البته روش 2 که گفتم همین مدل روش شماست منتها ایرادش اینه که شما وقتی دارید برای ماه گذشته رو حساب می کنید ردیف های بین 30 تا 60 تای قبلی رو می گردید، حالا اگه این بره برای آمار دو سال پیش، حدودا 720 ردیف count زده میشه، و حساب کنید که 100 هزار کاربر الان این آمار رو می خوان ببینن، چون سرویس دهنده ابزار آمار هست بازدیدهای وبلاگ و سایت های دیگه رو باید در نظر بگیریم که عددی نجومی است، بنابراین در چند ثانیه با این روش حدود 72 میلیون ردیف جمع شده میشه که رم رو می ترکونه
اما با روش اول شما این تعداد ردیف ندارید و آمار سال گذشته در یکی از ستون ها به روز شده و این 100 هزار کاربر تنها همان 100 هزار ردیف رو نیاز دارن، اما این هم شامل 80 ستونه که مجبورم 80 ستون رو نمایش بدم
تو این حالت که بدترین حالته ما 100 هزار 80 ستونی داریم اما در حالت شما 72 میلیون 5 ستونی داریم

5ستون رو هم که توضیح دادم شامل آی دی هر سایت، تعداد بازدیدهای روزانه، تاریخ آن روز، (بیشترین بازدید، بازدید کل) که این بیشترین بازدید و بازدید کل رو هم مجبورم روزانه همراه بیارم، چون نمی تونم بعد از 4 سال این حجم اطلاعات هزاران ردیف روزهای وبلاگ ها را ذخیره نگه دارم و با همراه داشتن میشه آمارهای دو سال پیش رو با خیال راحت پاک کرد

امیدوارم متوجه منظوراتم شده باشید، الان 4 گیگ رم دارم استفاده می کنم که تقریبا داره پر میشه

Unique
دوشنبه 11 دی 1391, 15:28 عصر
دوست عزیز ، به نظرم مشکل از پیاده سازی شماست ، شما اصلا چرا از یک table و mysql استفاده میکنید برای همه بازدید ها ، اینجوری query روش زیاد میشه و خیلی به سرور فشار میاد ! راه حلی که من توصیه میکنم اینه که برای هر کاربری یک فولدر بساز و آمار بازدید سایتش را توی فایل sqlite مختص به خودش نگه داره ، سرعت sqlite هم خیلی خوبه من خیلی ازش استفاده کردم (جالبه بدونی توی چندین مقاله هم خوندم که google به شدت توی پروژه هاش استفاده میکنه) خوب اینطوری که از بار روی سیستم را کم کردی ، اما همین هم کفایت نمیکنه و باید cache بگیری از آمار افراد که روی sqlite هم نخوای query بدی ! cache برای هفته ، ماه و سال که در این صورت دیگه فقط کافیه هفت روز (یا 30 روز بستگی به اینکه توی نمای اولیه چند روز را نشون میدی) داشته باشی و query ها را کم و کمتر کنی !

تا حالا این سیستم را اجرا نکردم اما اگه قرار بود اجرا کنم از این روش استفاده میکردم ! باز هم میگه شما باید خیلی مطالب را cache کنی و تنظیمات را ببری روی کاربر !
موفق باشین.

tehro0n
دوشنبه 11 دی 1391, 17:05 عصر
تو این لینک http://php.net/manual/en/book.sqlite3.php ذخیره و آپدیت و .. رو دیدم، حالا بحث اینجاس که چجوری از این اطلاعات محافظت کنم، چون پسوند db دانلود میشه، و اینکه خودم این اطلاعات رو چطور دستی تغییر بدم؟
http://www.ch-werner.de/sqliteodbc/ این لینک این کار رو انجام میده؟

و در نهایت مطالبی که خوندم مثل MySql گسترده نیست، آیا میشه 10 یا 20 میلیون توش رکورد داشت؟ یا برای هر کاربر بیام یکی از این فایل ها بسازم ( که البته اینجوری باید پوشه رو باز بگذارم و امنیتش میاد پایین )


اگه میشه یک نمونه پروژه کوچک هم برای دانلود بگذاری ممنون میشم
راستی تو php.ini چیزی رو باید تغییر بدم که sqlite کار کنه؟
extension=php_pdo_sqlite.dll و extension=php_sqlite.dll فعاله ولی وقتی کد مربوط sqlite رو میگذارم Server error میده!
البته تو لوکال هاست درست کار می کنه، سر این قضیه ورژن php رو هم 5.4.10 کردم

Unique
سه شنبه 12 دی 1391, 02:39 صبح
حالا بحث اینجاس که چجوری از این اطلاعات محافظت کنم، چون پسوند db دانلود میشه،
با htaccess. میتونی جلوی دانلود هر پسوندی که دوست داری را بگیری ! البته forbidden نکن ، بیا 404 not found بده تا کسی شک نکنه !


اینکه خودم این اطلاعات رو چطور دستی تغییر
برای sqlite خیلی manager هست هم آنلاین و هم آفلاین ، من از navicat استفاده میکنم.


و در نهایت مطالبی که خوندم مثل MySql گسترده نیست، آیا میشه 10 یا 20 میلیون توش رکورد داشت؟ یا برای هر کاربر بیام یکی از این فایل ها بسازم ( که البته اینجوری باید پوشه رو باز بگذارم و امنیتش میاد پایین )

sqlite از انواع File Based Database هستش و حتی اگه حجمش به 2 یا 4 گیگ هم برسه نباید مشکلی داشته باشه ، اما برای هر کاربر باید فایل جدا داشته باشی ! حتی میتونی برای منظور های مختلف چند تا فایل داشته باشی (اینجوری بهتر جواب میده) ، در مورد امنیت هم میتونی دسترسی را به user های ,وب کلا ببندین چون فقط روی سرور باهاشون کار دارین. مشکل امنیتی اصلا نداره.


راستی تو php.ini چیزی رو باید تغییر بدم که sqlite کار کنه؟
برای اتصال بهترین راه PDO هست ! توی وب هم مثال فراوونه کافیه جستجو کنید توی همین انجمن هم من چند باری کد گذاشتم.

tehro0n
پنج شنبه 14 دی 1391, 16:51 عصر
من با روش PDO که در http://www.if-not-true-then-false.com/2012/php-pdo-sqlite3-example/ است این کار را انجام دادم، ولی مشکل بزرگی که دارم اینه که هم پوشه و هم فایل دیتا باید پرمیشن 777 داشته باشن و این می تونه خیلی بد باشه
پسوند txt رو می شد با

chmod($file, 0755);
پرمیشن اش رو تغییر داد اما پوشه و این دیتا رو نمیشه، برای این مورد چی کار باید بکنم؟

Unique
جمعه 15 دی 1391, 03:00 صبح
خوب پسوندش را بگذارین txt اما چرا با htaccess. مانع از دسترسی به دایرکتوری این فایل ها نمیشین ؟
راستش اصلا مهم نیست پسوند فایل sqlite چی باشه ! اما در مورد chmod اطلاعات زیادی ندارم معمولا دسترسی ها را با htacess. کنترل میکنم. یا اصلا فایل ها را خارج از public_html ذخیره میکنم.

zarifcomputer
جمعه 15 دی 1391, 08:29 صبح
سلام
قبلا کمی در مورد وب گذر تحقیق کرده بودم و یک بار هم سعی کردم چیزی شبیه اون را درست کنم . یادمه در زمان تحلیل بانک اطلاعاتی اون پروژه سوالاتی شبیه سوالات شما برام پیش اومده بود . یه چیزهایی یادم میاد که بد نیست براتون بگم. شاید به دردتون بخوره:
1- رنج آی پی کشور ها ممکنه بیش از یک بازه باشه .
2- از کاربران سایت ها چه عضو باشند و چه بازدید کننده عادی فقط آی پی را نگهداری کنید.
3- اطلاعات مورد نظر شما باید در بیش از یک جدول نگهداری بشوند.
4- زمان های مورد نظر را دسته بندی کنید مثلا سال - 6 ماهه - یک ماه - هفته - روز (در این صورت صحبت از نگهداری رکوردهای میلیونی نخواهد بود)

پیروز و سربلند باشید

tehro0n
جمعه 15 دی 1391, 12:50 عصر
سلام
قبلا کمی در مورد وب گذر تحقیق کرده بودم و یک بار هم سعی کردم چیزی شبیه اون را درست کنم . یادمه در زمان تحلیل بانک اطلاعاتی اون پروژه سوالاتی شبیه سوالات شما برام پیش اومده بود . یه چیزهایی یادم میاد که بد نیست براتون بگم. شاید به دردتون بخوره:
1- رنج آی پی کشور ها ممکنه بیش از یک بازه باشه .
2- از کاربران سایت ها چه عضو باشند و چه بازدید کننده عادی فقط آی پی را نگهداری کنید.
3- اطلاعات مورد نظر شما باید در بیش از یک جدول نگهداری بشوند.
4- زمان های مورد نظر را دسته بندی کنید مثلا سال - 6 ماهه - یک ماه - هفته - روز (در این صورت صحبت از نگهداری رکوردهای میلیونی نخواهد بود)

پیروز و سربلند باشید

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

tehro0n
جمعه 15 دی 1391, 12:54 عصر
خوب پسوندش را بگذارین txt اما چرا با htaccess. مانع از دسترسی به دایرکتوری این فایل ها نمیشین ؟
راستش اصلا مهم نیست پسوند فایل sqlite چی باشه ! اما در مورد chmod اطلاعات زیادی ندارم معمولا دسترسی ها را با htacess. کنترل میکنم. یا اصلا فایل ها را خارج از public_html ذخیره میکنم.

یعنی منظورتون اینه که مثلا پوشه data رو کلا دسترسی بهش رو منحل کنم؟ که هرکی کلا آدرس data/1.txt رو هم زد با این که وجود داره به 404 منتقل بشه!
البته بحث پرمشن برای مخرب هاست که فایل های بی خودی و ویروسی تو اون پوشه ای که 777 نریزن، شما نیازی به 777 کردن نداشتید؟ من نمی دونم چیکار کنم با این مسئله

Unique
شنبه 16 دی 1391, 01:08 صبح
یعنی منظورتون اینه که مثلا پوشه data رو کلا دسترسی بهش رو منحل کنم؟ که هرکی کلا آدرس data/1.txt رو هم زد با این که وجود داره به 404 منتقل بشه!
دقیقا !


البته بحث پرمشن برای مخرب هاست که فایل های بی خودی و ویروسی تو اون پوشه ای که 777 نریزن، شما نیازی به 777 کردن نداشتید؟ من نمی دونم چیکار کنم با این مسئله
مگه چه کسی غیر از شما توش فایل ایجاد میکنه ؟! مگه کسی فایلی توی سایت شما upload میکنه که شما دارین به پوشه sqlite ها منتقل میکنین ؟!؟ من بعید میدونم اگه کدهاش شما امن باشن چنین مشکلی پیش بیاد.

tehro0n
شنبه 16 دی 1391, 13:45 عصر
مگه چه کسی غیر از شما توش فایل ایجاد میکنه ؟! مگه کسی فایلی توی سایت شما upload میکنه که شما دارین به پوشه sqlite ها منتقل میکنین ؟!؟ من بعید میدونم اگه کدهاش شما امن باشن چنین مشکلی پیش بیاد.

کشمکش ویروس ها و فایروال و سرورها همیشه ادامه داره، من الان آخرین ورژن آپاچی، فایروال CSF و MySql رو دارم و حتی کد نویسی های جدیدتری مثل MySqli و .. که ثابت شده اند سریعتر و امن تر هستن رو استفاده می کنم، اما باز هم وقتی رنکینگ سایت زیر 100 هزار میاد برخی افراد که اکثرا هم غیر ایرانی هستند می گردن و پوشه هایی که دسترسی ایجاد و یا ویرایش دارن رو پیدا می کنن، و یا دوست دارن دیتا بیس رو مشغول نگه دارن و یا شروع به پیدا کردن پسوورد روت و کنترل پنل ها می کنن، اگه حتی اکثر حفره ها رو ببندی باز یه مشکلی پیش میاد حالا شاید هم جدی نباشه!

من با این که لینوکس داشتم و با اینکه دسترسی پوشه محدود بود و آپلود کاربر هم وجود نداشت باز یک فایل index.html ساخته شده بود که پیغام هک شدن توش بود، ولی خوب چون تو همون پوشه فایل index.htm استفاده می کردم هیچ وقت اون صفحه اجرا نشد و در اینجا فهمیدم اولویت htm از html بیشتره!

دیگه چه برسه وقتی سطح دسترسی رو 777 بگذاریم چیا که می خوان وارد اون پوشه بشن..

tehro0n
سه شنبه 10 بهمن 1391, 19:39 عصر
فرق بین memory با file برای روش PDO SQLite در این لینک http://www.if-not-true-then-false.co...lite3-example/ چیه؟