PDA

View Full Version : insert کردن 1 میلیون رکورد سمت سرور



intel_amd
دوشنبه 28 مهر 1393, 21:16 عصر
سلام دوستان یک مشکلی با insert رکوردهای زیاد پیدا کردم که اینه که وقتی مثلا 1 میلیون رکورد داخل یک for میزنم که insert شه چون زمان پردازش طولانی میشه هنگ و پردازش متوقف میشه , حالا چطور میشه این کار را انجام داد مثلا با ایجاد یک ترد دیگر احتمالا مشکل حل شه

مهرداد سیف زاده
دوشنبه 28 مهر 1393, 21:46 عصر
برای حل این مشکل بجای استفاده از دستور insert‌جدا در داخل حلقه foreach ، داده های رو در داخل یک متغیر بریزید و سرآخر بصورت دسته ای insert کنید.
مرحله به مرحله بصورت زیر عمل کنید.

ابتدا یک آرایه برای ذخیره داده هایی که قراراه insert بشه:


$insert = array();

بعدش حلقه foreach بر روی داده هایی هست که قراره insert بشه


foreach ($all as $key => $value) {
$name= $value['name'];
$family = $value['family'];
$address = $value['address'];
$sql = "('$name','$family','$address')";
array_push($insert, $sql);
}

در اینجا فرض کردم ما یک متغیر all داریم که داده ها بصورت array‌توش هست(همون داده های قبلی که شما روش foreach میزدید) و این داده ها بصورت فعلی بر روی متغیر آرایه ای ما ذخیره میشه. حالا ما کل داده های رو بصورت دسته داریم ولی برای ذخیره در دیتابیس باید اونها رو با , از هم جدا کنیم:


$data_ins = implode(',', $insert);

در این جا باید query زده بشه و داده های دسته ای ما ذخیره بشه:


mysql_query("INSERT INTO `my_table` $data_ins");


حالا مکانیزم رو یکم براتون توضیح میدم:
شما در روش قبلی میومدید و در ۱۰۰۰ تا داده هر بار در درون foreach دستور insert رو فراخونی میکردید بصورت زیر


mysql_query("INSERT INTO `my_table` ('$name','$family',$address)");

این کار فشار زیادی به سرور میاره مثلا شما فرض کن ۱۰۰۰ تا داده دارید و اونوقت هزار بار دستور query زده میشه ولی خود mysql‌پیشنهاد میده که برای ذخیره بصورت دسته ای و تعداد بالا از روش زیر استفاده کنید:


INSERT INTO `my_table` ('$name','$family',$address),('$name','$family',$a ddress),('$name','$family',$address)

با این کار با یک بار query شما هزار تا داده هم میتونید یکدفعه منتقل کنید. حالا در کدهای بالا اومدم و ابتدا یک آرایه بزرگ از داده های ساختم و بعدش با implode اونها رو برای ذخیره query نهایی آماده کردم.

کد کامل بصورت زیر هست


$insert = array();


foreach ($all as $key => $value) {
$name= $value['name'];
$family = $value['family'];
$address = $value['address'];
$sql = "('$name','$family','$address')";
array_push($insert, $sql);
}


$data_ins = implode(',', $insert);


mysql_query("INSERT INTO `my_table` $data_ins");

intel_amd
جمعه 02 آبان 1393, 12:50 عصر
مشابه insert دسته ای کاری برای delet دسته ای هم میشه کرد؟
مثلا 5 هزار رکورد میخام پاک کنم که 5 هزار نوع id مختلف دارند

desatir7316
جمعه 02 آبان 1393, 13:42 عصر
DELETE FROM table WHERE id IN (2,4,5)

intel_amd
جمعه 02 آبان 1393, 14:20 عصر
پس اون 5000 تا id رکورد مورد نظر push کنم داخل یک آرایه بعد اسم آرایه را بگذارم داخل اون پرانتز که in از داخل اون آرایه بگرده درسته دیگه؟

Weblove
جمعه 02 آبان 1393, 14:32 عصر
خیلی از این ها رو با آزمون خطا بدست میاری و نیاز به این نیست وقت بگذاری سوال کنی

Unique
جمعه 02 آبان 1393, 17:38 عصر
خیلی از این ها رو با آزمون خطا بدست میاری و نیاز به این نیست وقت بگذاری سوال کنی
اتفاقا سوال میکنند که این آزمون و خطا ها را انجام ندهند و زودتر به جواب برسند ! البت هقرار نیست سوال کنیم و بشینیم کنار. سوال میکنیم و خودمون هم پیگیر هستیم و یا به نتیجه میرسیم یا با جواب بچه های همین انجمن به نتیجه میرسیم ! اگر هم کسی جواب نداد و خودمون به نتیجه رسیدیم چه خوب که در قالب یک پست آموزشی بگذاریم که اگه کسی نیاز پیدا کرد بتونه ازش استفاده کنه.

intel_amd
شنبه 03 آبان 1393, 12:16 عصر
منم دقیقا همیشه همین کاری که آقای unique گفت میکنم یعنی وقتی به مشکلی بربخورم که میبینم دقیقا جوابشو نمیدونم و بیشتر به تجربه بستگی داره و با سرچ راحت پیدا نمیشه یا اصلا نمیدونم مثلا فلان چیز یا راه هست که سرچش کنم اینجا تاپیک میذارم و همزمان خودم هم دارم روش کار میکنم و سرچامو تحقیقامو ادامه میدم یعنی به امید تاپیک اینجا دست از کار نمیکشم چه بسا این تاپیک هیچ موقع جواب داده نشه برای همین یا زودتر اینجا به جواب میرسم که دیگه سرچام متوقف میشه و به جواب رسیدم یا اینکه خودم زودتر به جواب میرسم مثل اینجا http://barnamenevis.org/showthread.php?473395-update-%D9%87%D9%85%D8%B2%D9%85%D8%A7%D9%86-%DA%86%D9%86%D8%AF-%D8%B1%DA%A9%D9%88%D8%B1%D8%AF-%D8%AF%D8%B1-%DA%86%D9%86%D8%AF-%D8%AC%D8%AF%D9%88%D9%84-%D9%85%D8%AE%D8%AA%D9%84%D9%81&p=2122792&viewfull=1#post2122792
که میام میگم حل شده و اگرهم کسی گفت منم نمیدونم جوابو میذارم

Weblove
شنبه 03 آبان 1393, 23:41 عصر
https://www.google.com/search?q=mysql+multiple+insert+in+single+query&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a&channel=sb