PDA

View Full Version : حرفه ای: این کوئری چند رکورد از جدول رو می خونه و چندتا رو بازیابی می کنه



i-php-i
دوشنبه 22 دی 1393, 03:09 صبح
فرض کنید توی یه جدول 200،000 رکورد داریم و این کوئری رو می زنیم

SELECT * FROM `tb1` LIMIT 1000 , 1100

سوالم اینه که وقتی کوئری بالا رو می زنیم:
1- اول همه 200،000 رکورد که با این کوئری مطابقت دارن توی حافظه ذخیره می شه بعد رکورد 1000 تا 1100 رو بر می گردونه؟
2- یا اینکه وقتی به 100 رکورد مورد نظر رسید از ادامه کار منصرف می شه و فقط همین صدتا که توی حافظه ذخیره شدن برگردونده می شن؟

saeedvir
دوشنبه 22 دی 1393, 04:08 صبح
فرض کنید توی یه جدول 200،000 رکورد داریم و این کوئری رو می زنیم

SELECT * FROM `tb1` LIMIT 1000 , 1100

سوالم اینه که وقتی کوئری بالا رو می زنیم:
1- اول همه 200،000 رکورد که با این کوئری مطابقت دارن توی حافظه ذخیره می شه بعد رکورد 1000 تا 1100 رو بر می گردونه؟
2- یا اینکه وقتی به 100 رکورد مورد نظر رسید از ادامه کار منصرف می شه و فقط همین صدتا که توی حافظه ذخیره شدن برگردونده می شن؟


در دستور Limit عدد اول ، شماره شروع است و دومی هم تعدادی که واکشی میشه.

MMSHFE
دوشنبه 22 دی 1393, 10:33 صبح
اول همه میان توی حافظه و بعد اون قسمت انتخاب میشه و بقیه Drop میشن. بخاطر همینه که میگن بهتره از LIMIT استفاده نکنید و با WHERE صفحه بندی بسازین.

i-php-i
سه شنبه 23 دی 1393, 01:52 صبح
چطور بدون LIMIT می شه صفحه بندی ساخت؟ اول باید تعداد رکوردهایی که با شرط مطابقت دارن بدست بیان (توی آرایه ذخیره بشن) بعد یه تعداد رو نمایش داد. برای صفحه بندی با استفاده از where راه مشخصی وجود داره؟

MMSHFE
سه شنبه 23 دی 1393, 08:26 صبح
شما وقتی فرضاً اطلاعات صفحه اول رو میخونید، کافیه id اولین و آخرین رکورد رو داشته باشین و لینک Previous و Next رو به این شکل بسازین:

<a href="?before=15">Previous</a>
<a href="?after=36">Next</a>
و توی صفحه رکوردها رو به این شکل استخراج کنید:

if(isset($_GET['before'])) {
$before = intval($_GET['before']);
$sql = "SELECT * FROM (SELECT * FROM `table` WHERE (`id`<'{$before}') ORDER BY `id` DESC LIMIT 10) AS `temp` ORDER BY `id`;";
}
elseif(isset($_GET['after'])) {
$after = intval($_GET['after']);
$sql = "SELECT * FROM `table` WHERE (`id`>'{$after}') ORDER BY `id` LIMIT 10;";
}
else {
$sql = "SELECT * FROM `table` ORDER BY `id` LIMIT 10;";
}
و کوئری رو اجرا کنید. دقت کنید که توی این حالت عملاً صفحه بندی به صورت 1 2 3 ... N نیست و فقط Next و Previous داریم ولی سرعتش توی آمار بالا خیلی بیشتر از LIMIT هست و بعلاوه وقتی حدود id رکوردهای موردنظر رو بدونیم، میشه با دستکاری کردن after و before توی آدرس، محدوده دلخواه رو بارگذاری کرد.

2undercover
سه شنبه 23 دی 1393, 09:28 صبح
شما وقتی فرضاً اطلاعات صفحه اول رو میخونید، کافیه id اولین و آخرین رکورد رو داشته باشین و لینک Previous و Next رو به این شکل بسازین:

<a href="?before=15">Previous</a>
<a href="?after=36">Next</a>
و توی صفحه رکوردها رو به این شکل استخراج کنید:

if(isset($_GET['before'])) {
$before = intval($_GET['before']);
$sql = "SELECT * FROM (SELECT * FROM `table` WHERE (`id`<'{$before}') ORDER BY `id` DESC LIMIT 10) AS `temp` ORDER BY `id`;";
}
elseif(isset($_GET['after'])) {
$after = intval($_GET['after']);
$sql = "SELECT * FROM `table` WHERE (`id`>'{$after}') ORDER BY `id` LIMIT 10;";
}
else {
$sql = "SELECT * FROM `table` ORDER BY `id` LIMIT 10;";
}
و کوئری رو اجرا کنید. دقت کنید که توی این حالت عملاً صفحه بندی به صورت 1 2 3 ... N نیست و فقط Next و Previous داریم ولی سرعتش توی آمار بالا خیلی بیشتر از LIMIT هست و بعلاوه وقتی حدود id رکوردهای موردنظر رو بدونیم، میشه با دستکاری کردن after و before توی آدرس، محدوده دلخواه رو بارگذاری کرد.

خوب الان باز هم باید از LIMIT استفاده بشه (LIMIT 10). آیا اگر از WHERE استفاده بشه به جای این که به شکل پست اول از LIMIT استفاده بشه (Offset و Number) تفاوتی دارند؟

MMSHFE
سه شنبه 23 دی 1393, 11:16 صبح
LIMIT 100 با LIMIT 10000,100 از زمین تا آسمون سرعتش فرق داره. Offset وقتی میگذاریم، باید فرضاً 10 هزار بار دنبال کارکتر پایان رکورد بگرده (چون طول رکوردها بخاطر فیلدهایی مثل TEXT و VARCHAR متفاوته) و اونها رو رد کنه و بعد 100 رکورد رو جدا کنه ولی اولی از همونجایی که اشاره گر روش قرار داره 100 رکورد جدا میکنه و اشاره گر هم بخاطر WHERE و استفاده از فیلد id که ایندکس شده، به سرعت به ابتدای رکورد موردنظر منتقل میشه.

i-php-i
چهارشنبه 24 دی 1393, 03:07 صبح
روش next و Previous توی خیلی از وب سایتها بکار نمی ره

برای صفحه بندی باید چیکار کرد که با مشکل کاهش سرعت مواجه نشیم؟