PDA

View Full Version : به روز رسانی چند میلیون رکورد



leaping
جمعه 28 فروردین 1394, 10:18 صبح
سلام
دوستان میخواستم بدونم به روز رسانی چند میلیون رکورد در یک دیتابیس مشکل خاصی از نظر بهینه بودن داره؟
یعنی اینکه به روز رسانی یکجای این همه رکورد بار اضافی خیلی زیاد میتونه واسه دیتابیس داشته باشه یا نه؟

Unique
جمعه 28 فروردین 1394, 14:14 عصر
به روز رسانی یعنی چی ؟
چند میلیون رکورد چی ؟ طول رکورد از نظر نوع data چقدره ! وضعیت index ها چقدره ؟
خیلی اما و اگر داره سوالتون

leaping
جمعه 28 فروردین 1394, 16:52 عصر
به روز رسانی یعنی چی ؟
چند میلیون رکورد چی ؟ طول رکورد از نظر نوع data چقدره ! وضعیت index ها چقدره ؟
خیلی اما و اگر داره سوالتون
ممنون از پیگیری
ببینید دوست عزیز که همیشه انقد جزئیات ریز میخوی :قهقهه:
منظورم از به روز رسانی واضحه = update
بعدشم اینکه یک تک ستون از نوع 255 varchar و در یک جدول و خب چند میلیون رکورد هم واضحه دیگه
چند میلیون رکورد :D و خب البته index هم نیست

MMSHFE
جمعه 28 فروردین 1394, 21:02 عصر
به شما اگه بگن شماره تلفن چند میلیون نفر رو توی یک دفتر تلفن اصلاح کنید و بگن هیچ ترتیبی هم وجود نداره و نمیدونیم اسم هر نفر رو کجای دفتر نوشتیم (عدم وجود ایندکس) و باید یکی یکی بگردین اسامی رو پیدا کنین و شماره ها رو اصلاح کنین، بهتون فشار میاد یا نه؟ دیتابیس هم همینه اوضاعش. حالا شما برای اینکه بهتون فشار نیاد چیکار میکنین؟ تقسیم میکنید میگین هر یک ساعت اینقدر اصلاح میکنم و بعد نیم ساعت استراحت و بعد دوباره شروع میکنم ادامه کار. دیتابیس هم مثل شماست. بهش فشار نیارین. بخصوص اینکه قراره همزمان جواب بقیه درخواستها رو هم بده. درست مثل اینکه به شما بگن در همون زمانی که دارین اطلاعات رو اصلاح میکنید، اگه یکی ازتون شماره یک نفر رو خواست، بگردین براش پیدا هم بکنید.

MMSHFE
جمعه 28 فروردین 1394, 21:04 عصر
ببینید دوست عزیز که همیشه انقد جزئیات ریز میخوی :قهقهه:

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

Unique
جمعه 28 فروردین 1394, 23:31 عصر
منظورم از به روز رسانی واضحه = update
یعنی شما میخواین یک میلیون رکورد را برای کوئری update بنویسین !؟ (جالبه)


بعدشم اینکه یک تک ستون از نوع 255 varchar و در یک جدول و خب چند میلیون رکورد هم واضحه دیگه
چیش واضحه !؟ شما تازه این اطلاعات را دادین ! یعنی جدول شما رکورد ID نداره ؟ شما فقط یک تک ستون دارین که هم SET میکنین هم توی WHERE میگذارین ؟ ستون مورد نظر یکتا هستش و مقدار تکراری نداره ؟


ببینید دوست عزیز که همیشه انقد جزئیات ریز میخوی
راستش مشکل سوالات شما اینه که شما فرض میکنید دوستان انجمن جزئیات کار شما را میدونن ! و این خیلی جالبه در صورتی که سوالتون واقعا نیاز به توضیحات بیشتری داره.

حالا اگه خوشتون نمیاد بیشتر توضیح بدین :
راستش به روز رسانی همه رکورد ها با update اگه واقعا قرار بر این هست که همه دوباره به روز بشن اشتباهه و با insert سرعت بیشتری خواهید داشت ، مخصوصا اگه اون تک ستون شما یکتا نیست و فیلد ID هم ندارین و کلا هیچ INDEX ی که یکتا باشه ندارین ! با این تفاسیر باید چند ساعتی صبر کنید اما با INSERT و یک سیستم خوب توی چند ثانیه حله !

leaping
شنبه 29 فروردین 1394, 08:51 صبح
آخه نمیدونم شما دقیقا چه توضیحات و ریز جزئیاتی میخواین و کل برنامه رو هم نمیشه اینجا نوشت که
بعدشم فرض کنید من در یک دیتابیس یه جدول دارم که در اون اسامی جدول اینطوری هست
id userid group title comment

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

id userid group title comment

خب حالا در بخش کامنت فرض کنید یک میلیون رکورد هست و در هر کامنت id کاربر و group کاربری هم مشخص شده ( از اینکه گروه رو هم در اینجا قید کردم به دلیل این هست که درون کامنت یک سری فیلترها با query ارسال میشه که خود جناب uniqe کم تا بیش در جریان این فیلتر هستن) از اونجایی که نمیشه بین دوتا رکورد در دوتا دیتابیس مختلف realtion زد در نتیجه وقتی از اون طرف گروه کاربری یک یوزر تغییر میکنه از این طرف رکوردهاشم باید این تغییرات رو اعمال کنن در بخش کامنت خب در این صورت از update استفاده میشه اگه اشتباه نکنم و یا اگر راه دیگری هست خوشحال میشم بدونم

j_naroogha@yahoo.com
شنبه 29 فروردین 1394, 09:30 صبح
http://stackoverflow.com/questions/16779552/how-to-update-on-cascade-in-mysql
میشه اینکارو بکنی....

leaping
شنبه 29 فروردین 1394, 11:45 صبح
http://stackoverflow.com/questions/16779552/how-to-update-on-cascade-in-mysql
میشه اینکارو بکنی....
دوست عزیز این امر درون یک دیتابیس صدق میکنه
نه دوتا دیتابیس

m.esmaeilzadeh
شنبه 29 فروردین 1394, 12:37 عصر
شاید منظور این است که اصلا قرار نیست where داشته باشه و صرفا شاید میخواید همه رکوردها یک فیلد مشخص مقداری خاص بگیرن , مثل این کوئری :


update `table` set `active`='1'

نه آقا کوئری رو اجرا کن , من موندم شما چه کاری رو دست گرفتی که چند میلیون رکورد داره !!!

شاید روی پروژه یارانه های دولت و از برنامه نویس های شرکت ( ... ) هستی :چشمک:

Mohammadsgh
شنبه 29 فروردین 1394, 13:24 عصر
آخه نمیدونم شما دقیقا چه توضیحات و ریز جزئیاتی میخواین و کل برنامه رو هم نمیشه اینجا نوشت که
بعدشم فرض کنید من در یک دیتابیس یه جدول دارم که در اون اسامی جدول اینطوری هست
id userid group title comment

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

id userid group title comment

خب حالا در بخش کامنت فرض کنید یک میلیون رکورد هست و در هر کامنت id کاربر و group کاربری هم مشخص شده ( از اینکه گروه رو هم در اینجا قید کردم به دلیل این هست که درون کامنت یک سری فیلترها با query ارسال میشه که خود جناب uniqe کم تا بیش در جریان این فیلتر هستن) از اونجایی که نمیشه بین دوتا رکورد در دوتا دیتابیس مختلف realtion زد در نتیجه وقتی از اون طرف گروه کاربری یک یوزر تغییر میکنه از این طرف رکوردهاشم باید این تغییرات رو اعمال کنن در بخش کامنت خب در این صورت از update استفاده میشه اگه اشتباه نکنم و یا اگر راه دیگری هست خوشحال میشم بدونم
شما هیچ توضیحی درباره به روز رسانی ندادید که به روز رسانیتون جدوله؟فیلده؟اگه فیلده نوعش چیه؟و هزار تا چیز دیگه و میخواید راهنماییتون کنن؟

leaping
شنبه 29 فروردین 1394, 13:31 عصر
شاید منظور این است که اصلا قرار نیست where داشته باشه و صرفا شاید میخواید همه رکوردها یک فیلد مشخص مقداری خاص بگیرن , مثل این کوئری :


update `table` set `active`='1'

نه آقا کوئری رو اجرا کن , من موندم شما چه کاری رو دست گرفتی که چند میلیون رکورد داره !!!

شاید روی پروژه یارانه های دولت و از برنامه نویس های شرکت ( ... ) هستی :چشمک:
چرا اتفاقا به این صورت از Where هم استفاده میشه

Unique
شنبه 29 فروردین 1394, 13:43 عصر
جناب leaping بگذارین من اینطوری پاسخ شما را بدم. شما خیلی زود دارین در مورد فشار به database و تعداد رکورد احتمالی و غیره فکر میکنید. فعلا سعی کنید با حداقل آگاهی که از بهینه سازی پایگاه های داده و نوشتن Query دارین کارتون را تکمیل کنید و هر زمانی به مشکل خوردین با گذاشتن کد کامل و توضیحات دیگه بهینه سازی کنید. من که با توضیحات فعلی کمک بیشتری از دستم بر نمیاد.

leaping
شنبه 29 فروردین 1394, 14:32 عصر
شما هیچ توضیحی درباره به روز رسانی ندادید که به روز رسانیتون جدوله؟فیلده؟اگه فیلده نوعش چیه؟و هزار تا چیز دیگه و میخواید راهنماییتون کنن؟
توضیحاتم به اندازه کافی بوده و منم نخواستم بهم جزئیات دقیق مقدار مشغول بودن دیتابیس رو بگن
بلکه گفتم استفاده از دستور update روی یک فیلد در میلیون ها رکورد برای به روزرسانی و تغییرش , سرور و خیلی مشغول میکنه یا نه؟

leaping
شنبه 29 فروردین 1394, 14:34 عصر
جناب leaping بگذارین من اینطوری پاسخ شما را بدم. شما خیلی زود دارین در مورد فشار به database و تعداد رکورد احتمالی و غیره فکر میکنید. فعلا سعی کنید با حداقل آگاهی که از بهینه سازی پایگاه های داده و نوشتن Query دارین کارتون را تکمیل کنید و هر زمانی به مشکل خوردین با گذاشتن کد کامل و توضیحات دیگه بهینه سازی کنید. من که با توضیحات فعلی کمک بیشتری از دستم بر نمیاد.
مشکل اینجاست که همین الان در ابتدا چند ده هزار رکورد دارم و دارم به این فک میکنم که بخوام یک فیلد رو آپدیت کنم چه فشاری به سرور میاد
حالا من نمیدونم شما دقیقا چیا میخواید اما من اطلاعات رو که گفتین گذاشتم دیگه نمیدونم چیا لازم دارید

Unique
یک شنبه 30 فروردین 1394, 00:00 صبح
که بخوام یک فیلد رو آپدیت کنم چه فشاری به سرور میاد
معمولا فیلد را با ستون ID که یکتا هست و Primary Index هست Update میکنند. Update کردن ۱ رکورد که هیچی ۱۰۰ تا رکورد هم با استفاده از این ستون هیچ زمانی نمیگیره و هیچ فشاری هم به Database نمیاد ! حتی اگه دیتابیستون ۵۰ میلیون رکورد داشته باشه. چند صد هزار تا که یکجور شوخیه. MySQL و MariaDb و PostgreSQL را انقدر دست کم نگیرید. البته به قدرت سرور هم خیلی بستگی داره. خودم توی یک پروژه دارم روی ۳ میلیون رکورد هر روز ۷۰۰ یا ۸۰۰ بروزرسانی خیلی راحت و بدون فشار به سرور انجام میدم !

leaping
یک شنبه 30 فروردین 1394, 00:27 صبح
معمولا فیلد را با ستون ID که یکتا هست و Primary Index هست Update میکنند. Update کردن ۱ رکورد که هیچی ۱۰۰ تا رکورد هم با استفاده از این ستون هیچ زمانی نمیگیره و هیچ فشاری هم به Database نمیاد ! حتی اگه دیتابیستون ۵۰ میلیون رکورد داشته باشه. چند صد هزار تا که یکجور شوخیه. MySQL و MariaDb و PostgreSQL را انقدر دست کم نگیرید. البته به قدرت سرور هم خیلی بستگی داره. خودم توی یک پروژه دارم روی ۳ میلیون رکورد هر روز ۷۰۰ یا ۸۰۰ بروزرسانی خیلی راحت و بدون فشار به سرور انجام میدم !
آقا دمت گرم من همین رو میخواستم
معلومه که از id استفاده شده تو ساختار جدول هم همون بالا توضیح دادم و بازهم معلومه که از primary استفاده کردم دیگه اینا از بدیهیات
من فقط میخواستم بدونم این چندص هزارتا خیلی فشار میاره یا نه ؟
همین
ممنون

m.esmaeilzadeh
یک شنبه 30 فروردین 1394, 15:30 عصر
معمولا فیلد را با ستون ID که یکتا هست و Primary Index هست Update میکنند. Update کردن ۱ رکورد که هیچی ۱۰۰ تا رکورد هم با استفاده از این ستون هیچ زمانی نمیگیره و هیچ فشاری هم به Database نمیاد ! حتی اگه دیتابیستون ۵۰ میلیون رکورد داشته باشه. چند صد هزار تا که یکجور شوخیه. MySQL و MariaDb و PostgreSQL را انقدر دست کم نگیرید. البته به قدرت سرور هم خیلی بستگی داره. خودم توی یک پروژه دارم روی ۳ میلیون رکورد هر روز ۷۰۰ یا ۸۰۰ بروزرسانی خیلی راحت و بدون فشار به سرور انجام میدم !

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

rezaonline.net
یک شنبه 30 فروردین 1394, 16:49 عصر
یک سوال : اگر یک فیلد عددی مثلا شماره تلفن رو index بزاریم سرعتش برای جستجو خیلی سریع میشه !
اگر فیلد کاراکتر مثلا نام و نام فامیلی باشه چی ؟ میتونه موثر باشه ؟!
باید نوع index رو چی بزاریم ؟
فیلدی رو index بذارید که عملیات sort و دستورات شرطی روش انجام میشه .
سعی کنید فیلد عددی باشه
اگر unique بود که چه بهتر
در غیر اینصورت اولویت رو روی char و سپس varchar بذارید .
سعی کنید فیلدی که ایندکس میذارید مقدار null نگیره .


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

این دو تا عکس رو ببین و بشین پروژه تو انجام بده
اولیش تعداد رکوردهاش معلومه 5.5 میلیون رکورد
130445


اینم یه آپدیت برای جنابعالی تا سرعتشو ببینی
130446

:)
حالا با خیال راحت بشین بقیه پروژه تو بنویس نگران دیتابیس نباش:لبخندساده:

leaping
یک شنبه 30 فروردین 1394, 17:49 عصر
اصن حرکتت از پهنا تو حلقم :D دمت گرم
ولی رضا یه چیزی
این 3 row affected اینجا یکم درگیرم کرد.تو این هم زیاد فرقی نمیکنه این قضیه؟

MMSHFE
دوشنبه 31 فروردین 1394, 08:35 صبح
لطفاً وقتی درست پشت سر پست قبلی دارین جواب میدین، نقل قول نکنید. پستها طولانی میشن و خوندنش مشکل میشه و دیتابیس سایت رو هم بیهوده سنگین میکنید.

rezaonline.net
دوشنبه 31 فروردین 1394, 10:51 صبح
ولی رضا یه چیزی
این 3 row affected اینجا یکم درگیرم کرد.تو این هم زیاد فرقی نمیکنه این قضیه؟
نه مشکلی نداره .
هر شرطی روی کلید اصلی ات انجام بشه هیچ مشکلی نداره روی هرچند تعداد رکوردی که داشته باشی.
اصلا خودت تست کن ، یه دیتابیس بساز یه میلیون اینزرت کن توش راحته که :)


update items set browser_version=34,minute=34 where id=6555956 Query executed OK, 1 row affected. (0.001 s) Edit

parsidev
دوشنبه 31 فروردین 1394, 14:20 عصر
اگه فیلد آپدیت یا varchar زیر 4000 کاراکتر باشه میشه گفت ؛ سرور درگیر نمیشه
اما ترجیحا برای بهینه شدن بانک اطلاعاتی و بالطبع کمتر شدن زمان تراکنش اگه فیلد ذکر شده در بخش where ایندکس شده باشه خیلی بهتر خواهد بود