سلام
دوستان میخواستم بدونم به روز رسانی چند میلیون رکورد در یک دیتابیس مشکل خاصی از نظر بهینه بودن داره؟
یعنی اینکه به روز رسانی یکجای این همه رکورد بار اضافی خیلی زیاد میتونه واسه دیتابیس داشته باشه یا نه؟
سلام
دوستان میخواستم بدونم به روز رسانی چند میلیون رکورد در یک دیتابیس مشکل خاصی از نظر بهینه بودن داره؟
یعنی اینکه به روز رسانی یکجای این همه رکورد بار اضافی خیلی زیاد میتونه واسه دیتابیس داشته باشه یا نه؟
به روز رسانی یعنی چی ؟
چند میلیون رکورد چی ؟ طول رکورد از نظر نوع data چقدره ! وضعیت index ها چقدره ؟
خیلی اما و اگر داره سوالتون
به شما اگه بگن شماره تلفن چند میلیون نفر رو توی یک دفتر تلفن اصلاح کنید و بگن هیچ ترتیبی هم وجود نداره و نمیدونیم اسم هر نفر رو کجای دفتر نوشتیم (عدم وجود ایندکس) و باید یکی یکی بگردین اسامی رو پیدا کنین و شماره ها رو اصلاح کنین، بهتون فشار میاد یا نه؟ دیتابیس هم همینه اوضاعش. حالا شما برای اینکه بهتون فشار نیاد چیکار میکنین؟ تقسیم میکنید میگین هر یک ساعت اینقدر اصلاح میکنم و بعد نیم ساعت استراحت و بعد دوباره شروع میکنم ادامه کار. دیتابیس هم مثل شماست. بهش فشار نیارین. بخصوص اینکه قراره همزمان جواب بقیه درخواستها رو هم بده. درست مثل اینکه به شما بگن در همون زمانی که دارین اطلاعات رو اصلاح میکنید، اگه یکی ازتون شماره یک نفر رو خواست، بگردین براش پیدا هم بکنید.
ابداً موضوع خنده داری نمیدونم این مسئله رو. وقتی جواب راهگشا میخواین، باید دقیقاً سناریوی خودتون رو توضیح بدین. دکتر که تشریف میبرین و میگین سرما خوردم، دیگه معاینه نمیکنه؟ صرفاً به همون بیان اسم بیماری ازطرف شما اکتفا میکنه یا دقیقاً باید مشکل رو بدونه تا بتونه راه حل ارائه بده؟
یعنی شما میخواین یک میلیون رکورد را برای کوئری update بنویسین !؟ (جالبه)منظورم از به روز رسانی واضحه = update
چیش واضحه !؟ شما تازه این اطلاعات را دادین ! یعنی جدول شما رکورد ID نداره ؟ شما فقط یک تک ستون دارین که هم SET میکنین هم توی WHERE میگذارین ؟ ستون مورد نظر یکتا هستش و مقدار تکراری نداره ؟بعدشم اینکه یک تک ستون از نوع 255 varchar و در یک جدول و خب چند میلیون رکورد هم واضحه دیگه
راستش مشکل سوالات شما اینه که شما فرض میکنید دوستان انجمن جزئیات کار شما را میدونن ! و این خیلی جالبه در صورتی که سوالتون واقعا نیاز به توضیحات بیشتری داره.ببینید دوست عزیز که همیشه انقد جزئیات ریز میخوی
حالا اگه خوشتون نمیاد بیشتر توضیح بدین :
راستش به روز رسانی همه رکورد ها با update اگه واقعا قرار بر این هست که همه دوباره به روز بشن اشتباهه و با insert سرعت بیشتری خواهید داشت ، مخصوصا اگه اون تک ستون شما یکتا نیست و فیلد ID هم ندارین و کلا هیچ INDEX ی که یکتا باشه ندارین ! با این تفاسیر باید چند ساعتی صبر کنید اما با INSERT و یک سیستم خوب توی چند ثانیه حله !
آخه نمیدونم شما دقیقا چه توضیحات و ریز جزئیاتی میخواین و کل برنامه رو هم نمیشه اینجا نوشت که
بعدشم فرض کنید من در یک دیتابیس یه جدول دارم که در اون اسامی جدول اینطوری هست
id userid group title comment
و از اون طرف اطلاعات یوز یا کاربر ما در یک جدول دیگه در یک دیتابیس دیگه به این ترتیب هست
id userid group title comment
خب حالا در بخش کامنت فرض کنید یک میلیون رکورد هست و در هر کامنت id کاربر و group کاربری هم مشخص شده ( از اینکه گروه رو هم در اینجا قید کردم به دلیل این هست که درون کامنت یک سری فیلترها با query ارسال میشه که خود جناب uniqe کم تا بیش در جریان این فیلتر هستن) از اونجایی که نمیشه بین دوتا رکورد در دوتا دیتابیس مختلف realtion زد در نتیجه وقتی از اون طرف گروه کاربری یک یوزر تغییر میکنه از این طرف رکوردهاشم باید این تغییرات رو اعمال کنن در بخش کامنت خب در این صورت از update استفاده میشه اگه اشتباه نکنم و یا اگر راه دیگری هست خوشحال میشم بدونم
http://stackoverflow.com/questions/1...scade-in-mysql
میشه اینکارو بکنی....
شاید منظور این است که اصلا قرار نیست where داشته باشه و صرفا شاید میخواید همه رکوردها یک فیلد مشخص مقداری خاص بگیرن , مثل این کوئری :
update `table` set `active`='1'
نه آقا کوئری رو اجرا کن , من موندم شما چه کاری رو دست گرفتی که چند میلیون رکورد داره !!!
شاید روی پروژه یارانه های دولت و از برنامه نویس های شرکت ( ... ) هستی
جناب leaping بگذارین من اینطوری پاسخ شما را بدم. شما خیلی زود دارین در مورد فشار به database و تعداد رکورد احتمالی و غیره فکر میکنید. فعلا سعی کنید با حداقل آگاهی که از بهینه سازی پایگاه های داده و نوشتن Query دارین کارتون را تکمیل کنید و هر زمانی به مشکل خوردین با گذاشتن کد کامل و توضیحات دیگه بهینه سازی کنید. من که با توضیحات فعلی کمک بیشتری از دستم بر نمیاد.
معمولا فیلد را با ستون ID که یکتا هست و Primary Index هست Update میکنند. Update کردن ۱ رکورد که هیچی ۱۰۰ تا رکورد هم با استفاده از این ستون هیچ زمانی نمیگیره و هیچ فشاری هم به Database نمیاد ! حتی اگه دیتابیستون ۵۰ میلیون رکورد داشته باشه. چند صد هزار تا که یکجور شوخیه. MySQL و MariaDb و PostgreSQL را انقدر دست کم نگیرید. البته به قدرت سرور هم خیلی بستگی داره. خودم توی یک پروژه دارم روی ۳ میلیون رکورد هر روز ۷۰۰ یا ۸۰۰ بروزرسانی خیلی راحت و بدون فشار به سرور انجام میدم !که بخوام یک فیلد رو آپدیت کنم چه فشاری به سرور میاد
فیلدی رو index بذارید که عملیات sort و دستورات شرطی روش انجام میشه .
سعی کنید فیلد عددی باشه
اگر unique بود که چه بهتر
در غیر اینصورت اولویت رو روی char و سپس varchar بذارید .
سعی کنید فیلدی که ایندکس میذارید مقدار null نگیره .
این دو تا عکس رو ببین و بشین پروژه تو انجام بدهآقا دمت گرم من همین رو میخواستم
معلومه که از id استفاده شده تو ساختار جدول هم همون بالا توضیح دادم و بازهم معلومه که از primary استفاده کردم دیگه اینا از بدیهیات
من فقط میخواستم بدونم این چندص هزارتا خیلی فشار میاره یا نه ؟
همین
ممنون
اولیش تعداد رکوردهاش معلومه 5.5 میلیون رکورد
1.png
اینم یه آپدیت برای جنابعالی تا سرعتشو ببینی
2.png
:)
حالا با خیال راحت بشین بقیه پروژه تو بنویس نگران دیتابیس نباش
اصن حرکتت از پهنا تو حلقم :D دمت گرم
ولی رضا یه چیزی
این 3 row affected اینجا یکم درگیرم کرد.تو این هم زیاد فرقی نمیکنه این قضیه؟
آخرین ویرایش به وسیله MMSHFE : دوشنبه 31 فروردین 1394 در 08:34 صبح دلیل: عدم نیاز به نقل قول
لطفاً وقتی درست پشت سر پست قبلی دارین جواب میدین، نقل قول نکنید. پستها طولانی میشن و خوندنش مشکل میشه و دیتابیس سایت رو هم بیهوده سنگین میکنید.
نه مشکلی نداره .ولی رضا یه چیزی
این 3 row affected اینجا یکم درگیرم کرد.تو این هم زیاد فرقی نمیکنه این قضیه؟
هر شرطی روی کلید اصلی ات انجام بشه هیچ مشکلی نداره روی هرچند تعداد رکوردی که داشته باشی.
اصلا خودت تست کن ، یه دیتابیس بساز یه میلیون اینزرت کن توش راحته که :)
کد HTML:update items set browser_version=34,minute=34 where id=6555956 Query executed OK, 1 row affected. (0.001 s) Edit
اگه فیلد آپدیت یا varchar زیر 4000 کاراکتر باشه میشه گفت ؛ سرور درگیر نمیشه
اما ترجیحا برای بهینه شدن بانک اطلاعاتی و بالطبع کمتر شدن زمان تراکنش اگه فیلد ذکر شده در بخش where ایندکس شده باشه خیلی بهتر خواهد بود