PDA

View Full Version : سوال: سوال پیرامون کوئری Insert (در SQL)



tecnocomputer2
چهارشنبه 27 بهمن 1389, 18:59 عصر
سلام
قصد دارم یک سری اطلاعات Insert کنم تو دیتابیسم، حدود 10 الی 1000 رکورد همزمان. کدی هست که طوری همزمان همه رکوردهام ذخیره شه تو بانک که فشاری به سرور نیاره؟

اگه روشی نیست و مجبودم با یه حلقه for یکی یکی رکوردها رو insert کنم تو دیتابیسم، کدی هست که تو حلقه بزارم که هر رکوردی که ثبت کرد چند لحظه صبر کنه و بعد رکورد بعدی رو ثبت کنه.

خلاصه:
میخام 1000 رکورد رو Insert کنم تو بانک طوری که به سرور فشار نیاد!

cpuman
چهارشنبه 27 بهمن 1389, 20:31 عصر
بعد هر insert یه sleep(1) بزار

امیـرحسین
چهارشنبه 27 بهمن 1389, 23:15 عصر
اول اینکه 1000 تا سطر رقمی نیست که بخواد به سرور فشار بیاره! اون سروری که اینجوری بهش فشار بیاد به هیچ درد نمیخوره.
دوم اینکه با یک دستور INSERT میشه تعداد زیادی سطر رو وارد کرد. اجرای هر دستور به عنوان یک کوئری خودش فاجعه است. حتما از سینتکس زیر استفاده کنید:

INSERT INTO myTable (field1, field2, field3)
VALUES
(value1_1, value1_2, value1_3),
(value2_1, value2_2, value2_3),
(value3_1, value3_2, value3_3);
پس بجای اینکه توسط حلقه FOR هی mysql_query (یا توابع مشابهش) رو اجرا کنید. توسط حلقه کوئری رو بسازید و فقط یکبار اجراش کنید. یا مثلا 1000 تا سطر رو با 4 تا دستور 250تایی درج کنید.

tecnocomputer2
پنج شنبه 28 بهمن 1389, 00:30 صبح
امیـرحسین جان، روش حلقه for رو درصورتی خواستم انجام بدم که دیگه راهی نداشته باشم. قصدم اینه که کمترین فشار به سرور بیاره.

cpuman جان، دستور:

sleep(1);
یک ثانیه صبر میکنه، بر حثب ثانیه هست. PHP تابعی داره که بشه مقداری کمتر از ثانیه بهش بدیم؟ (مثلا میلی ثانیه)
من اینجا رو خودندم: http://php.net/manual/en/function.sleep.php متاسفانه چیزی متوجه نشدم.

tecnocomputer2
پنج شنبه 28 بهمن 1389, 00:51 صبح
با تابع usleep میشه کمتر از یک ثانیه هم مقدار بدیم برای صبر. مثال زیر دو ثانیه صبر میکنه:

usleep(2000000);
کسی اطلاعات بیشتر میخاد اینجا رو بخونه: http://www.php.net/manual/en/function.usleep.php

امیـرحسین
پنج شنبه 28 بهمن 1389, 23:30 عصر
باید راههای بهینه رو پیدا کرد Sleep راه حل نیست!
درج حجم بالای اطلاعات یا توی عملیات انتقال اتفاق میافته یا توی سایتهای خیلی پرترافیک.
برای عملیات انتقال بهتره به طریق Restore عمل کنید یعنی کوئری های بزرگ تولید کنید مثل کاری که مثلا PhpMyAdmin موقع Import میکنه. کلی راه بهینه و استاندارد برای این قبیل کارها وجود داره نیاز به PHP رو تقریبا صفر میکنه!
در حالت دوم یعنی سایتهای پرترافیک اینجور روشها کلا و کلا و کلا خطاست...

mehdimdp
جمعه 29 بهمن 1389, 00:00 صبح
به نظر من بهترین روش ، روش آقای امیرحسین هست که خیلی راحت و بی درد سر هست.

tecnocomputer2
جمعه 29 بهمن 1389, 00:01 صبح
از روش insertی که اقای امیرحسین گفتن استفاده میکنم، sleep رو واسه جایی دیگه میخاستم...