۷ اشتباه رایج SQL که کوئریها را کند میکنند + چکلیست PDF
قبل از تغییر سرور، ستونهای اضافی، شرطهای غیرقابلاستفاده برای ایندکس، OFFSET بزرگ و N+1 را بررسی کنید؛ چکلیست همراه برای مرور است.

این فایل را چطور استفاده کنید؟
چکلیست سهصفحهای آکادمی 01 برای مرور سریع خطاهای متداول کوئری تهیه شده است. این مقاله به شما کمک میکند هر مورد را به یک آزمایش وصل کنید. نسخهٔ PDF را کنار محیط توسعه نگه دارید و برای هر بهینهسازی، نتیجهٔ قبل و بعد را ثبت کنید.
۱ و ۲: دادهٔ اضافه و تابع روی ستون
SELECT * وقتی فقط دو ستون لازم دارید، انتقال داده را بیشتر میکند و ممکن است مزیت ایندکس پوشاننده را از بین ببرد. همچنین تابع روی ستون ایندکسدار، در ایندکس معمولی میتواند روش دسترسی را محدود کند. وجود ایندکس تابعی یا بهینهسازی خاص موتور استثناست؛ نقشهٔ اجرا را بخوانید.
SELECT id, total FROM orders WHERE user_id = 7;
-- بازهٔ زمانی، بهجای DATE(created_at)
WHERE created_at >= '2026-10-01'
AND created_at < '2026-10-02'۳ و ۴: الگوی جستوجو و ستونهای رابطه
جستوجوی LIKE با wildcard ابتدای عبارت معمولاً از مسیر معمول B-Tree برای پیشوند سود نمیبرد. تغییر آن به جستوجوی پیشوندی فقط وقتی درست است که معنای موردنیاز کاربر حفظ شود؛ برای جستوجوی بخشی از متن شاید ابزار دیگری لازم باشد. ستونهای پرتکرار در WHERE و JOIN هم نامزد بررسیاند، نه دستور ساخت ایندکس بیحساب.
یک ایندکس روی ستون status کمتنوع همیشه مفید نیست. ترکیب ستون، انتخابپذیری و ترتیب نتیجه را در کنار هم بسنجید. نتیجهٔ EXPLAIN باید تصمیم را پشتیبانی کند.
۵ و ۶: OFFSET بزرگ و N+1
SELECT id, title FROM posts
WHERE id > :last_id
ORDER BY id LIMIT 20;این نمونه، صفحهبندی کلیدمحور برای ترتیب یکتای id است. در ترتیبهای دیگر باید cursor همهٔ کلیدهای لازم را داشته باشد. این روش با پرش مستقیم به صفحهٔ دلخواه یکسان نیست؛ قرارداد رابط کاربری را هم در نظر بگیرید.
N+1 یعنی پس از گرفتن فهرست، برای هر ردیف درخواست جدا بزنید. بارگذاری گروهی یا eager loading میتواند رفتوبرگشت را کم کند، ولی تعداد و حجم دادهٔ خروجی را باز هم اندازه بگیرید.
۷: بدون شاهد بهینهسازی نکنید
- یک کوئری پرتکرار واقعی انتخاب کنید.
- تعداد ردیف و الگوی ورودی را ثبت کنید.
- یک متغیر را در هر مرحله تغییر دهید.
- زمان، نقشهٔ اجرا و هزینهٔ نوشتن را مقایسه کنید.
چکلیست برای پیدا کردن نقطهٔ شروع است؛ هر مورد قانون مطلق نیست. اگر تغییری نتیجه را بهتر نکرد، فرض اولیه را اصلاح کنید. هدف، حفظ معنای صحیح کوئری با هزینهٔ کمتر است.
پرسشهای متداول
جایگزین LIKE همیشه جستوجوی پیشوندی است؟
این چکلیست برای همهٔ موتورهای SQL یکسان است؟
فایل همراه این راهنما
دانلود رایگان فایل آموزشی و تمرینهای این مطلب؛ فایل اصلی آکادمی 01 برای مرور آفلاین در دسترس است.
منابع و مطالعهٔ بیشتر
نوشته و بازبینی تحریریهٔ آکادمی 01 · آخرین بررسی منابع: ۲۵ اکتبر ۲۰۲۶. مثالها آموزشیاند و باید با نسخه و شرایط پروژهٔ خودتان آزمایش شوند.
