PDA

View Full Version : سوال: بهینه سازی دیتابیس MYSQL



siavashsay
چهارشنبه 20 دی 1391, 10:25 صبح
دوستان ممنون میشم اگر اطلاعاتی در مورد بهینه سازی دیتابیس دارن رو به اشتراک بذارن !
من در حال ساختن جداولی هستم که فیلدهای اون بیشتر از 20 هست !
واسه همین میخوام اطلاعات static مثل username - password - email - ... ور در یک جدول و اطلاعات Dynamic رو مثل account_balance - Description - ... در جدول دیگه ذخیره کنم !
این کار رو به 2 علت میخوام انجام بدم !
1- امنیت بیشتر - چون اگر از یک جدول Injection خورد ( البته خدای نکرده ) کل اطلاعات واسه هکر رو نشه !
2- سبک شدن دیتابیس و تعداد کوئری ها !
ضمنا این 2 جدول رو میخوام فیلد اولشون رو با Username که ثابت اونها هست قابل دسترسی کنم !
حالا برای اینکه بتونم اطلاعات رو در مواقع مورد نیاز از این 2 جدول ادغام کنم یا بیرون بکشم نیاز به نوشتن 2 تا Sql هست یا با Join میشه اینکارو کرد !
لطفا راهنمایی مستقیم کنید ! ممنون میشم !

rezaonline.net
چهارشنبه 20 دی 1391, 10:45 صبح
خوبه .

ضمنا این 2 جدول رو میخوام فیلد اولشون رو با Username که ثابت اونها هست قابل دسترسی کنم
username چرا ؟ از id عددشون استفاده کن .

حالا برای اینکه بتونم اطلاعات رو در مواقع مورد نیاز از این 2 جدول ادغام کنم یا بیرون بکشم نیاز به نوشتن 2 تا Sql هست یا با Join میشه اینکارو کرد !
با join میشه توی یه کوئری هر تعداد فیلد از هر جدولی رو برگردوند به شرطی که یک کلید دو به دو بیشنون مشترک باشه ، مثلا user_id

siavashsay
چهارشنبه 20 دی 1391, 10:52 صبح
ا join میشه توی یه کوئری هر تعداد فیلد از هر جدولی رو برگردوند به شرطی که یک کلید دو به دو بیشنون مشترک باشه ، مثلا user_id

اول اینکه سایت من 2 نوع کاربر داره یکی Webmasters - و دیگری Users
واسه همین میخوام از Username استفاده کنم ! چون جدول من طوری هست که نمیشه از ID که auto_incerment هست استفاده کرد ! البته حدسم اینه چون یه قضیه پیچیده داره !
اما برای هر Webmasters یک wm_id دارم که حالا شاید بشه از اون استفاده کرد اما بازم احساسم اینه که username قویتر و راحتتره !
حالا یه چیزی !
برای Update کردن اطلاعات هم میشه از Join استفاده کرد ؟!

dousti_design
چهارشنبه 20 دی 1391, 11:15 صبح
1- امنیت بیشتر - چون اگر از یک جدول Injection خورد ( البته خدای نکرده ) کل اطلاعات واسه هکر رو نشه !
فکر نکنم از لحاظ امنیت فرقی داشته باشه چون اگه یه جدول اینجکت بشه اونیکی هم میشه. برای اینجکل از دیتابیس information_schema استفاده میشه که همه جداول و فیلدها توش ذخیره شده. حالا ما که اسم تمامی جداول و فیلدها رو داریم و از یه جدول هم سلکت کردیم چرا از اونیکی نتونیم؟

2- سبک شدن دیتابیس و تعداد کوئری ها !
درسته بنطرم.

اول اینکه سایت من 2 نوع کاربر داره یکی Webmasters - و دیگری Users
واسه همین میخوام از Username استفاده کنم ! چون جدول من طوری هست که نمیشه از ID که auto_incerment هست استفاده کرد ! البته حدسم اینه چون یه قضیه پیچیده داره !
اما برای هر Webmasters یک wm_id دارم که حالا شاید بشه از اون استفاده کرد اما بازم احساسم اینه که username قویتر و راحتتره !
اگه برای هر دو نوع یوزر از یه جدول استفاده کردید (فیلد user_type دارید) میشه اما اگه جدا باشن یکم پیچیده میشه.

برای Update کردن اطلاعات هم میشه از Join استفاده کرد ؟!

UPDATE product p
INNER JOIN productPrice pp
ON p.productId = pp.productId
SET pp.price = pp.price * 0.8,
p.dateUpdate = CURDATE()
WHERE p.dateCreated < '2004-01-01'
بله میشه. mysql update (http://www.electrictoolbox.com/article/mysql/cross-table-update/)

siavashsay
چهارشنبه 20 دی 1391, 12:30 عصر
ممنون از راهنماییتون !

rezaonline.net
چهارشنبه 20 دی 1391, 14:53 عصر
اول اینکه سایت من 2 نوع کاربر داره یکی Webmasters - و دیگری Usersیک فیلد به جدول کاربرها اضافه کن بنویس access_level و از نوع tinyint1 بذار با دو مقدار 1 و 2 مقدار دهی کن ، 1 برای مدیر ، 2 برای کاربر .
عنوان تاپیک رو گذاشتی بهمینه سازی دیتابیس .
یکی از موارد بهینه سازی دیتابیس کم کردن حجم داده هاست ، استفاده از داده های int هست ، لزومی نداره نام کاربری همه جا تکرار بشه ، شما توی جدول یوزر به ازای هر رکورد یک id دارید اون میشه کلید دسترسی شما به اون رکورد حالا هر جا میخواید میتونی اسفتاد کنید .
دسترسی به اون id زیاد هم سخت نیستا!
شما وقتی کاربر عضویت رو پر کرد اول جدول اول رو پر کن بعد id شو بگیر با استفاده از
mysql_insert_id() و براساس اون جدول دوم رو پر کن .
(دوست ندارم بگم از قابلیت کلید خارجی استفاده کنی چون مطمئنم گیج میشی الان)

نکته دیگه توی بهینه سازی دیتابیس انتخاب دیتاتایپ صحیح هست .
اصلا بیا یه کاری بکن ، اون دو تا تیبل رو بذار اینجا باهم بهینه پیاده اش کنیم .

siavashsay
چهارشنبه 20 دی 1391, 17:36 عصر
ممنونم از لطفت رضا جان !
اما فیلدهای من فیلدهای معمولی هستن !
اما اینکه فرمودید
نکته دیگه توی بهینه سازی دیتابیس انتخاب دیتاتایپ صحیح هست .
میشه یه توضحی در مورد انواع انتخاب ها بدی !
به هر حال فیلدهایی مثل username - password - email - uid - account_balance - description - tell_number و غیره باید چه تایپهایی داشته باشند ؟!
من اکثرا از varchar و برایت تکست ها longtext برای account_balance از float استفاده میکنم !

rezaonline.net
چهارشنبه 20 دی 1391, 18:50 عصر
به خاطر همین گفتم ساختار دیتابیست رو بذار اینجا .
دستورات sql ساخت این جدولت رو بذار تا توضیحات رو بدم .
longtext استفاده نکن چون فکر نکنم حجم هر رکوردت 401 گیگ برسه :لبخند: به جاش از text استفاده کن که 65535بایت گنجایش داره .
varchar نهایت باید 255 باشه طولش اگر کمتر بود بهتر
برای فیلدهایی مثل پسورد که همیشه طول یکتایی دارن مثلا همیشه طولشون 32 هست به جای varchar از char استفاده کنید با طول دقیق .
char سریعتر هست همچنین حافظه کمتری از varchar میگیرید اما برای مواقعی که طول رشته کمتر باشد همیشه دست بالا را میگیرد :خجالت: پس فقط برای فیلدهایی با طول مشخص !
username , email باید varchar150 خوبه
داده های عددی اگر مثبت هستن از زبانه attrib گزینه unsigned رو بزنید .
نهایت گنجایش داده های عددی رو برات مینویسم بطور مثال برای uid باید smallint یا mediumint بذاری نه مثل وردپرس bigint :ناراحت:
tinyint 0-255
smallint 0-65535
mediumint 0-16777215
int 0-4294967295
bigint 0-1844674407370955615

مقدار اشغال حافظه هم
tinyint یک بایت
smallint دو بایت
mediumint سه بایت
int چهاربایت
bigint هشت بایت

وقتی توی یک جدول دیگه براساس id جدول یوز ، یک فیلد داشتی به اسم user_id که روش عملیات واکشی زیادی داشتی (منظورم where های زیادی هست که بصورت where user_id=X هستن) اون فیلد رو index بذار ، اگر یکتاست unique بذار .
ایندکس گذاری باعث افزایش سرعت select میشه !

siavashsay
چهارشنبه 20 دی 1391, 19:16 عصر
عالی بود !
مخصوصا اون قسمت که میخوام فیلد فقط عدد مثبت یا 0 باشه !
مثلا برای accoun_balance که هیچ موقع نباید کمتر از 0 باشه !
بازم ممنون ! عالی بود