PDA

View Full Version : کد جایگرین برای mysql_num_rows در پروژه هایی با دیتابیس بزرگ



trasilver
دوشنبه 16 دی 1392, 23:02 عصر
با سلام خدمت دوستان.

دوستان عزیز مثلا توی یک تیبل از دیتابیس ما 130 میلیون رکورد داریم! (حدودا کم گفتم :افسرده:) :گیج::متعجب:

حالا ما مثلا می خوایم تعداد یک سری از این رکورد هارو با مشخصاتی که میدیم بگیریم.

خوب اون جور که می دونید از mysql_num_rows استفاده کردن واقعا مشکل و زمان بر هست :کف:

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

با تشکر.

SlowCode
دوشنبه 16 دی 1392, 23:34 عصر
سلام
از دستور COUNT (http://www.w3schools.com/sql/sql_func_count.asp)خود Mysql استفاده کن.

trasilver
دوشنبه 16 دی 1392, 23:58 عصر
مثلا کد:

$q = "SELECT * FROM tabales WHERE `test` = $test";
$result = mysql_query($q);
$record = mysql_num_rows($result);
تبدیل میشه به:

$q = "SELECT COUNT(id) FROM tabales WHERE `test` = $test";
$record = mysql_query($q);
؟

MRmoon
سه شنبه 17 دی 1392, 06:55 صبح
ولي تاجايي كه من ميدونم بايد دوباره همون رو هم fetch كني تا به دست بياري.؟

يا اينطوري نيست؟

Tarragon
سه شنبه 17 دی 1392, 07:36 صبح
$q = "SELECT COUNT(id) as count FROM tabales WHERE `test` = $test";

$record = mysql_fetch_assoc(mysql_query($q));

$count = $record['count'];

2undercover
سه شنبه 17 دی 1392, 10:57 صبح
البته راه های دیگه ای هم وجود داره که بستگی به استفاده شما داره:

1. استفاده از یک جدول برای شماره ها: (برای هر یک رکورد که به جدول با اون مشخصات خاص اضافه میشه توی اون جدول شمارنده یک مقدار به اون رکورد مربوط مشخصات خاص اضافه می کنید)

2. اگر مقدار تقریبی هم کفایت می کنه می تونید از SHOW TABLE STATUS (http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html) هم استفاده کنید!

http://stackoverflow.com/questions/10976328/mysql-count-performance-on-very-big-tables

metal gear solid 4
سه شنبه 17 دی 1392, 12:09 عصر
شما چطور میخاید بدون fetch کردن اطلاعات تعداد رکوردها رو به دست بیارید آخه!!
ضمن اینکه یک table با ساختار خوب. ایندکس شده . تعداد رکورد تاثیر زیادی روی زمان select کردن نخواهد داشت.
به عنوان مثال من خودم اطلاعات 30 رکورد آخر از جدولی رو که شامل 2-3 فیلد عددی و یک فیلد Varchar میشد رو از جدول زمانیکه تعداد رکوردها 100 هزار بود در 0.0004 ثانیه گرفتم.
و همین فیلدها رو در همون جدول با تعداد رکورد 10 میلیون در 0.0007 ثانیه گرفتم.
تا زمانیکه تعداد رکوردهای شما کمتر از 100 میلیون هستند نگران این مسائل نباشید.
اگر هم از این تعداد بیشتر هستند پیشنهاد من اینه از دیتابیس های Key -> Value ) NoSQL ) در کنار بانک اصلیتون استفاده کنید تا بتونید برخی نیازمندیها رو کش کنید. Memcached و Redis گزینه های خوبی هستند.
البته من خودم از Redis استفاده میکنم و عقیدم بر این هست که از Memcached بهتره چرا که نوع داده های بیشتری رو پشتیبانی میکنه.

trasilver
سه شنبه 17 دی 1392, 12:24 عصر
من خودم زیاد روی ایندکس گذاری ها تحقیق کردم و جستجو ولی منبع درست و حسابی پیدا نکردم! یا از ب بسم الله پریده بود ن پایان یا اینکه ناقص توضیح داده شده بود یا اینکه فکر نکنم خود نویسندش هم فهمیده باشه چی نوشته :گیج::لبخند: وگرنه من خیلی به این ایندکس گذاری اعتقاد دارم و برام چند جایی ایندکس گذاری کردن نتیجش فوق العاده عالی بوده.

hamedarian2009
سه شنبه 17 دی 1392, 13:08 عصر
سلام به نظر من که بهتری مهاجرت کنید به mysqli و دستور جایگزینش هم
mysqli_stmt_num_rows() هست

trasilver
سه شنبه 17 دی 1392, 13:11 عصر
دستور mysqli_stmt_num_rows() سرعت بالا تری داره یا دستور COUNT ؟

SlowCode
سه شنبه 17 دی 1392, 15:37 عصر
دستور mysqli_stmt_num_rows() سرعت بالا تری داره یا دستور COUNT ؟
شما وقتی از دستور زیر استفاده میکنی:

SELECT * FROM tables WHERE age=20

همه رکوردهای مچ شده برگردونده میشن و تو رم ذخیره میشه. حالا اگه تعداد رکوردهای شما زیاد باشه رم بیشتری اشغال میشه.
ولی وقتی از count استفاده میکنی فقط یه مقدار(تعداد رکوردها) برگردونده میشه.
پس اگه اینطوری حساب کنیم سرعت count بیشتر خواهد بود.