رضا
2 سال پیش توسط رضا مطرح شد
9 پاسخ

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

دوستان من یه درخواست مشابه زدم این سری این سوال رو دارم فقط افرادی که با این مشکل بر خوردن واقعا می تونن راهنمایی کنن که یک دنیا هم ممنون می شم ازشون.
من یک جدول دارم توش بیش از 15 میلیون رکورد وجود داره به اسم wallet توی اون name , balance ,user id هستش حالا هر یوزر من یه صفحه داره به اسم ولت لیست وقتی روی اون صفحه می زنه
foreach ($wallets as wallet)
echo $wallet->name;
echo $wallet_balance;
مسله اینجاست هر یوزر من حداقل 100 تا رکورد داره که این صد رکورد توی یک جدول 15 میلیون رکوردی هستش و وقتی یوزرم روی لیست ولت ها میزنه قراره 100 ولتش با بالانس اونها لیست بشن اما مشکل اینجا هستش این رویه اینقدر زمان بر میشه که به تایم اوت می خوره .چطور از حلقه فور ایچ برای جستجو در جدولی که ده ها میلیون رکورد داره استفاده کنیم که زمان کمتر از 10 ثانیه صرف بشه ؟
پیشاپیش ممنونم


ثبت پرسش جدید
Arshiamohammadei
تخصص : وب و هوش مصنوعی
@Arshiamohammadei 2 سال پیش آپدیت شد
0

سلام و درود دوست عزیز
روش های متنوعی برای دسترسی به این داده ها هست به نظر من از mvc استفاده کنید از این مدل برای دریافت اطلاعات بزرگ و پرحجم استفاده می شود ومیتوانید یک کوئری طراحی کنید که فقط رکورد های مخصوص اون یوزر رو دریافت کنه این امکان توی لاراول به شدت آسان هست یا توی pdo
برای مثال من میخوام تمام رکورد های مربوط به یوزر admin رو نمایش بدم

modelName::where('data','admin')->get()

بعد با foreach داده هارو نمایش میدم این یک کار پرسرعت تر هست
از pdo و خود mysql هم میشه کوئری کد بالا هست

SELECT column_name(s) FROM table_name WHERE column_name operator value 

یک مثال

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT id, firstname, lastname FROM MyGuests WHERE lastname='Doe'";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
  // output data of each row
  while($row = $result->fetch_assoc()) {
    echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
  }
} else {
  echo "0 results";
}
$conn->close();
?>

به این خاصیت where می گویند می تونید توی اینترنت نتایجی خوبی پیدا کنید

این راه ها سرعت خوبی دارند اگه از پایگاه داده خود php mysql استفاده میکنید به pdo تغییر دهید برای بالا بردن سرعت foreach سعی کنید متغیر های قابل تعریف را برای حلقه بسازید تا سرعت پردازش کمتر شود مثل زیر

for( $i=0; i< count($arrA); $i++){
  echo count($arrA);
}

به این تبدیل کنید


$len = count($arrA);
for( $i=0; i< $len; $i++){
  echo $len;
}

یا

$users = User::all(); foreach($users as $user) {
    // Do something here 
}

به

$users = User::select(['id', 'first_name', 'last_name'])->get(); 
foreach($users as $user) {
    // Do something here
}

https://roocket.ir/articles/6-quick-easy-ways-to-speed-up-your-laravel-website یه سری به این لینک هم بزنید
اگه زبان برنامه نویسی php رو خوب یادگرفتید حتما پیشنهاد میشود برای طراحی سایت با این حجم از داده به سرغ لاراول بروید


Arshiamohammadei
تخصص : وب و هوش مصنوعی
@Arshiamohammadei 2 سال پیش مطرح شد
0

سلام و درود دوست عزیز
روش های متنوعی برای دسترسی به این داده ها هست به نظر من از mvc استفاده کنید از این مدل برای دریافت اطلاعات بزرگ و پرحجم استفاده می شود ومیتوانید یک کوئری طراحی کنید که فقط رکورد های مخصوص اون یوزر رو دریافت کنه این امکان توی لاراول به شدت آسان هست یا توی pdo
برای مثال من میخوام تمام رکورد های مربوط به یوزر admin رو نمایش بدم

modelName::where('data','admin')->get()

بعد با foreach داده هارو نمایش میدم این یک کار پرسرعت تر هست
از pdo و خود mysql هم میشه کوئری کد بالا هست

SELECT column_name(s) FROM table_name WHERE column_name operator value 

یک مثال

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT id, firstname, lastname FROM MyGuests WHERE lastname='Doe'";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
  // output data of each row
  while($row = $result->fetch_assoc()) {
    echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
  }
} else {
  echo "0 results";
}
$conn->close();
?>

به این خاصیت where می گویند می تونید توی اینترنت نتایجی خوبی پیدا کنید


رضا
@Laravedev68 2 سال پیش مطرح شد
0

دوستان عزیز ممنونم از پاسختون اما در واقعیت کاملا متفاوت هستش بذارید من یه نمونه نشون بدم خدمتتون

 $Wallets = CryptoInfo::Where('status','Active')->get();
        foreach($Wallets as $wallet)
              {
        WalletName::chunk(25, function ($users) {
            foreach ($users as $user) {
                echo $user->wallet_balance;
             //   echo ':';
             //   echo $user->wallet_balance;
                echo '<br>';
            }
        });
            }

قبل از اینکه کد بالا رو بنویسم از چانک استفاده کنم روش های شما دوستان رو هم رفتم یه چیزی بگم خدمتتون جدول من 15 میلیون رکورد داره هر یوزر تقریبا 100 الی 300 رکورد این جدول ماله اون و امکان داره رکوردهاش شماره 10 باشه یا شماره 500 یا 1 میلیون و ... وقتی می خوام بکشه بیرون اطلاعات رو 60 ثانیه رو رد می کنه . شما رهکاری دارید که عملیاتی کرده باشین نه فقطتئوری بلکه تو کار باهاش کار کرده باشین و جواب هم گرفته باشین . نکته بگم خدمتتون وقتی اطلاعات رو می کشیم بیرون اگه عددی باشن خوب سرعت بالاتره اما اگه رشته باشه دیگه هیچی میره تو فاز هنگ کامل.


Arshiamohammadei
تخصص : وب و هوش مصنوعی
@Arshiamohammadei 2 سال پیش مطرح شد
0

روی چه هاست یا سروری پروژه رو اجرا میکنید


رضا
@Laravedev68 2 سال پیش مطرح شد
0

عزیز سرورم اختصاصی هستش 128 گیگ رم و لایت اسپید و .... هارد دیسک هم nvme2


رضا
@Laravedev68 2 سال پیش مطرح شد
0

دوستان من به یه نتیجه ای رسیدم اینجاست که می گن گاهی اوقات دانش یا پایینه یا دیتابیس MYSQL ضعیفه.
دیتابیس mysql تو کوری تست من 15 میلیون رکورد تونست با 1 حلقه foreach به خوبی کار کنه اما هر کاری کردم وقتی حلقه foreach تو در تو بود نتوسنت جواب خوبی بگیره و به شدت کند هستش یعنی اگه یه حلقه foreach داشته باشی بعد توی اون حلقه مجدد بزنی برای کشیدن اطلاعات دیتابیس بیرون هر کاری کنی نمی تونی سریع باشی من همه روش ها رو تست کردم از Select کردن تا chunk و ارتباط داخل Model و ... هر کاری کردم نشد با سرعت بالا اطلاعات فراخوانی بشه.


رحمت جعفری
تخصص : laravel developer
@tirtash 2 سال پیش مطرح شد
0

سلام. در افسانه ها میگفتند که برای داده ها با حجم بالا باید از mongodb استفاده کنید و mysql معمولا جوابگوی آن نیست و همیشه یه لنگی میزنه.


Arshiamohammadei
تخصص : وب و هوش مصنوعی
@Arshiamohammadei 2 سال پیش مطرح شد
0

به طور کلی با هر شکل کد نویسی با زبان php من امتحان کردم نشد این حجم داده رو دریافت کنم و تایم اوت میزد توی ذهنم هم بود که از یه پایگاه داده دیگه استفاده کنم مانگو رو انتخاب کردم ولی با زبان php و فریم ورک نسبت به mysql هزار برابر سرعتش خوب تر بود ولی با پایتون همین کارو کردم سرعتش هم خیلی بهتر از php بود @Laravedev68 @tirtash


میکائیل
تخصص : برنامه نویسی سمت سرور و کلاینت
@FullStack 2 سال پیش آپدیت شد
0

دوست عزیز این حجم از اطلاعات رو mysql نمیتونه هندله کنه (توی اون زمانی که تو میخوای انجام بشه) اگه بتونه هم که بعید میدونم توی اون زمانی که شما میخوای انجام بده ممکنه سخت و پیچیده بشه معمولا این حجم از اطلاعات که بیشتر توی برنامه های چت قابل مشاهده هست رو توی دیتابیس mongodb هندل میکنن که مثل آب خوردن براتون انجام میده هرجوری حساب کنی و هر روشی بری 15 میلیون داده برای myql خیلی زیاده و توی 10 ثانیه نمیونه بهت جواب بده مگه اینکه سرور خیلی قوی بخری ممکنه که اونم فکر نکنم باز به اون تایم برسه


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام