MySQL so'rovlarini optimallashtirish.

topshirish / Golovna

Qo'shimcha funksionallik

Ushbu kichik maqola MySQL ma'lumotlar bazalari, tanlash va qo'llab-quvvatlash haqida.

Ma'lumotlar bazalari bilan ishlashda ko'pincha qo'shiqli yoki qo'shiqsiz COUNT() qatorlarini yaratish kerak bo'ladi, bu faqat keyingi qadam yordamida amalga oshirilishi mumkin.

MySQL kodiga qarash

Ushbu kichik maqola MySQL ma'lumotlar bazalari, tanlash va qo'llab-quvvatlash haqida.

U qiymatlarni jadvaldagi qatorlar soniga qarab aylantiradi.

Pídrakhunok aql bilan

Ushbu kichik maqola MySQL ma'lumotlar bazalari, tanlash va qo'llab-quvvatlash haqida.

Jadvalda berilgan ma'lumotlarga mos keladigan qatorlarning to'g'ri sonini so'rang: var = 1

Ushbu kichik maqola MySQL ma'lumotlar bazalari, tanlash va qo'llab-quvvatlash haqida.

Turli xil yuvishli qatorlardan bir qator qiymatlarni olib tashlash uchun siz bir qator yuvish vositalaridan foydalanishingiz mumkin, masalan

Biroq, ba'zi hollarda bu yondashuv amaliy va maqbul emas.

Shu sababli, bitta so'rovda bir qator natijalarni olish uchun so'rovni bir nechta kichik so'rovlar bilan tashkil qilish dolzarb bo'lib qoladi.

Masalan

Shunday qilib, ma'lumotlar bazasiga faqat bitta yozuvni qo'shgan holda, biz natijani sahifaga qandaydir qiymat qo'yish uchun bir qator miyalar ortidagi qatorlardan olib tashlaymiz, masalan

Ushbu kichik maqola MySQL ma'lumotlar bazalari, tanlash va qo'llab-quvvatlash haqida.

MATN kodini ko'rib chiqish

Biroq, ba'zi hollarda bu yondashuv amaliy va maqbul emas.

c1|c2|c3 -------- 1 |5 |8

Cheklangan miqdordagi so'rovlar bilan siz qidiruv tezligini va ma'lumotlar bazasiga kirishni yaxshilash uchun bir qator boshqa so'rovlardan foydalanishingiz mumkin.

Keyingi qadam bitta MySQL so'roviga COUNT sonini qo'yishdir, lekin boshqa usulda IF konstruktsiyalari (aql, qiymat 1, qiymat 2) va SUM() ishlatiladi.
Bitta so‘rovda belgilangan mezonlar asosida ma’lumotlarni tanlash, keyin ularni qo‘shish va natijada olingan qiymatni ko‘rsatish imkonini beradi. Savoldan ko'rinib turibdiki, ichimlikni qisqacha tugatish niyati yo'q edi, lekin xotinining likvidligi uni mamnun qilmadi, natijasi bo'ladi,
jami|c1|c2|c3 -------------- 14 |1 |5 |8 Keyinchalik, men COUNT() dekallarini tanlash uchun uchta turli so'rov variantlari tezligi bo'yicha izchil statistik ma'lumotlarni taqdim etaman.
So'rovlarning ravonligini tekshirish uchun uch mingdan ortiq yozuvlarni joylashtirish uchun jadvalga teri turidagi 1000 ta so'rov qo'shildi. Ushbu nuqtada ma'lumotlar bazasi tomonidan natijalarni keshlashni yoqish uchun SQL_NO_CACHE parametrini kiriting.

Visnovok.

Biroq, bizda COUNT() buyrug'i yordamida MySQL ma'lumotlar bazasini so'rash uchun bir qator variantlar mavjud, boshqa so'rovlar bilan birinchi variant juda oddiy emas, lekin tezlik bo'yicha eng yaxshi natija berishi mumkin.

Pastki ichimliklar bilan boshqa variant ancha sodda, ammo bu holda suyuqlikning likvidligi past bo'ladi.

Va biz IF va SUM konstruktsiyalaridan foydalangan holda uchinchi qisqacha variantni topamiz, bu eng qulay bo'lib tuyuladi va eng past viconnary tezligiga ega, bu birinchi ikkita variantdan ikki baravar past.

Shuning uchun, ma'lumotlar bazasi ishini optimallashtirish vazifasi qo'yilganda, men COUNT() bilan so'rov o'rniga boshqa so'rov variantidan foydalanishni tavsiya qilaman, birinchi navbatda, uning tezligi eng yaxshi natijaga yaqin, aks holda bunday tashkilot bitta so'rovni qulay tugatadi. O'tgan darsda biz bitta qobiliyatsizlikka duch keldik. Agar biz "velosipedlar" mavzusini kim yaratganini bilmoqchi bo'lsak, biz quyidagi taklifni boshladik: O'tgan darsda biz bitta qobiliyatsizlikka duch keldik. Muallifning ismi o‘rniga uning identifikatorini olib tashladik.

Bu tushunarli va biz bir jadvalga kirish uchun ham ishladik - Mavzular va mavzular mualliflarining ismlari boshqa jadvalda - Koristuvachda saqlanadi.

Shuning uchun, muallifning identifikatorini tanib, uning ismini bilish uchun biz yana bir so'rov qilishimiz kerak - Koristuvachi jadvaliga:

SQL bunday so'rovlarni ulardan birini quyi so'rovga (ilova qilingan so'rovlar) aylantirish orqali birlashtirish imkoniyatini beradi.

Shunday qilib, "velosipedlar" mavzusini yaratishni bilish uchun biz quyidagilarni so'raymiz:

  • Keyin kalit so'zdan keyin

  • QAYERDA

  • , xayolimizning bir chetiga yana bir savol yozamiz.

  • MySQL endi so'rovni yakunlaydi, id_author=2 ga aylanadi va bu qiymat taklifga o'tkaziladi
Oh, lord, va men hissa haqida aytmoqchi bo'lgan hamma narsa.
  • Sizning hurmatingizni oshirish uchun ikkita fikrni aytib o'tmoqchiman:
  • Uchdan ortiq kirish darajasi bilan ichimliklar tayyorlash tavsiya etilmaydi.

    Bu kodning vaqtini va murakkabligini oshirishga olib keladi.

    Ichki iboralar sintaksisi takomillashtirildi, bu ko'p harakat qilish imkonini beradi, lekin umuman bir xil emas.
Misol uchun, biz yuvinishimiz mumkin edi

yozish

  • Tobto.

Biz WHERE kalit so'zini ishlatadigan istalgan operatorlardan foydalanishimiz mumkin (biz ularni oxirgi darsda o'rgangan edik).

9 iyun 2008 yil 23:37 haqida

  • MySQL so'rovlarini optimallashtirish
    MySQL

    Har kuni onalar savollarni yozishda bir xil turdagi so'rovlarni to'ldirishlari kerak.

  • Ushbu maqolada men yozmaslikning amaliy tomonlarini ko'rsatmoqchiman.
    Barcha maydonlarni tanlash

    SELECT * FROM jadval
    So'rovlarni yozishdan oldin barcha maydonlarni tanlamang - "*".
    Faqat sizga kerak bo'lgan maydonlarni qayta tashkil qiling.
    Bu tanlangan va haddan tashqari kuchga ega bo'lgan sanalar sonini qisqartirishdir.

    Aytgancha, qamrab oladigan indekslar haqida unutmang.
    Jadvaldagi barcha maydonlarni kerak bo'lganda tanlang, aniqrog'i ularni o'zgartiring.

    Avvalo, bu kodni o'qishga yordam beradi.
    Agar yulduzlar har xil bo'lsa, jadvaldagi qaysi maydonlarni ko'rib chiqmasdan turib bilib bo'lmaydi.
    Aks holda, jadvalingizdagi ustunlar soni o'zgartirilishi mumkin va bugungi kunda beshta INT ustuni mavjud, keyin bir oydan so'ng tanlovni yaxshilash uchun TEXT va BLOB maydonlarini qo'shishingiz mumkin.
    Tsiklni so'rang."value"]);!}!}

    SQL ko'p til ekanligini aniq tushunish muhimdir.
    Protsessual til nuqtai nazaridan fikrlaydigan ba'zi dasturchilar uchun tilning ko'pligini yodda tutish kerak.

    Siz oddiy qoidaga rioya qilgan holda ichishni davom ettirishingiz mumkin - hech qachon tsiklda ichimlikni o'tkazib yubormang.
    Ba'zan bitta jadvaldagi qatorlar sonini yangilashingiz kerak bo'ladi.
    Muhimi shundaki, u yangilangan, ammo hamma narsa oddiy:" WHERE id IN (1, 2, 3).!}!}

    YANGILASH news SET title="test
    Teri yozuvi har xil bo'lishi muhim bo'lganligi sababli, buni quyidagi savol bilan qilish mumkin:
    Yangiliklar to'plamini YANGILASH
    sarlavha = CASE
    WHEN news_id = 1 KEYIN "aa"
    WHEN news_id = 2 KEYIN "bb" TUG'ADI

    WHERE news_id IN (1, 2)

  • Bizning testlarimiz shuni ko'rsatadiki, bunday so'rov boshqa so'rovlarga qaraganda 2-3 marta kichikroq.
    Indekslangan maydonlarda operatsiyalarni o'tkazish

    Blogs_count * 2 = $qiymatli foydalanuvchilardan foydalanuvchi_identifikatorini tanlang
    Bu yozuvda zafar indeksi mavjud emas, lekin u blogs_count indekslash tizimidir.

    Indeks indekslangandan so'ng, kirishda indekslangan maydonni o'zgartirishga hojat yo'q.
    Bunday so'rovlar uchun konvertatsiya funktsiyalarini boshqa qismga o'tkazing:<= 10;

    blogs_count = $value / 2;
    Shunga o'xshash dumba:
    QAYERDA TO_DAYS(CURRENT_DATE) - TO_DAYS(roʻyxatdan oʻtgan) foydalanuvchilardan foydalanuvchi_identifikatorini tanlang.

  • Siz ro'yxatdan o'tgan maydonga asoslangan indeks bo'yicha g'olib bo'lmaysiz, xuddi shunday
    Roʻyxatdan oʻtgan foydalanuvchilarDAN user_id ni tanlang >= DATE_SUB(CURRENT_DATE, INTERVAL 10 KUN);
    bo'ladi.
    Ularning miqdorini kiyinish uchun faqat bitta qatorlarni tanlash
  • $natija = mysql_query("TANI * jadvaldan", $link);
    $num_rows = mysql_num_rows($natija);
    Agar siz qo'shiq ongini ifodalovchi bir qator qatorlarni tanlashingiz kerak bo'lsa, ularning sonini saqlab qolish uchun barcha qatorlarni tanlash o'rniga SELECT COUNT(*) FROM jadval bayonotidan foydalaning.< 20) {

    }
    Qatorlarni tanlash
  • $natija = mysql_query("1-jadvaldan SELECT *", $link);
    while($row = mysql_fetch_assoc($natija) && $i

    Agar sizga n dan ortiq qatorlar kerak bo'lsa, dasturda tanlangan qatorlarni chiqarish uchun LIMIT dan foydalaning.

    Wikoristannya Buyurtma RAND()
    RAND() LIMIT 1-jadvaldan TARTIBINI TANLASH;
    Agar jadval kattaroq bo'lsa, kamida 4-5 ming qator bo'lsa, ORDER BY RAND() samaraliroq bo'ladi.

    Ikki so'zni yozish ancha samarali:
    auto_increment jadvali birinchi kalitga ega bo'lgani uchun va to'lib-toshganlar yo'q:
    $rnd = rand(1, so'rov("Jadvaldan MAXS (id) ni tanlang"));
    $row = query("SELECT * FROM table WHERE id = ".$rnd);

  • Abo:
    $cnt = so'rov ("Jadvaldan COUNT(*) TANLASH");
    $satr = so'rov("SELECT * FROM jadval LIMIT ".$cnt.", 1");
    jadvalda juda ko'p qatorlar mavjud bo'lsa, bu ko'proq mos kelishi mumkin.
    Vykoristannya katta miqdorda QO'SHILING
    TANLASH
    v.video_id
    a.ism,
    g.janr
    a.ism,
    FROM
    a.ism,
    videos AS v
    a.ism,
    janrlar AS g ON g.genre_id = lg.genre_id

    Shuni esda tutish kerakki, jadvalni bog'lashda tanlovdagi qatorlar soni JOIN teri loyihasi bilan o'sadi. O'tmishdagi o'xshash vaziyatlar uchun shunga o'xshash savolni bir nechta oddiy savollarga bo'lish mumkin.

  • Vikoristannya LIMIT
    SELECT... LIMIT jadvalidan $start, $per_page

    Shunga o'xshash so'rovni o'ylaydigan har bir kishi, ehtimol $per_page yozuvlarini to'ldiradi (aytaylik, 10-20) va bu yaxshi fikr.

  • Bundan tashqari, dastlabki bir necha tomonlar uchun yorliqdan foydalanishingiz kerak bo'ladi.
    Agar yozuvlar soni ko'p bo'lsa va SELECT ... FROM LIMIT 1000000, 1000020 jadvalini kiritish kerak bo'lsa, buni to'ldirish uchun MySQL avval 1000020 ta yozuvni, keyin birinchi millionni va keyin 2 0 ni tanlaydi. Bu bo'lmasligi mumkin. umuman ajoyib.

    Muammoni hal qilishning ahamiyatsiz usullari yo'q.
    Ko'pchilik oddiygina mavjud sahifalar sonini o'rtacha raqam bilan cheklaydi.
    Shuningdek, siz uchinchi tomon echimlarini (masalan, sfenks) qamrab oladigan o'xshash indekslar bo'yicha so'rovlarni tezlashtirishingiz mumkin.
    Nevikoristannya DUBLIKAT KALİT YANGILANISHDA

    $satr = so'rov("SELECT * FROM jadval WHERE id=1");
    Agar ($ qator)

query("Yangilanish jadvali SET ustuni = ustun + 1 WHERE id=1")

boshqa query("INSERT INTO table SET ustuni = 1, id=1"); Id maydonidagi asosiy yoki yagona kalitning ravshanligini ta'minlash uchun shunga o'xshash konstruktsiya bitta vergul bilan almashtirilishi mumkin: INSERT INTO INTO table SET ustuni = 1, id=1 DUPLICATE KEY YANGILISHI ustuni = ustun + 1.

O'qing

Men allaqachon turli xil narsalar haqida yozganman

SQL so'rovlari , agar murakkab nutqlar haqida gapirish vaqti kelgan bo'lsa, masalan, Bir nechta jadvallardan yozuvlarni tanlash uchun SQL so'rovi Agar biz bir xil jadvaldan tanlov qilsak, hamma narsa juda oddiy bo'lar edi:.

WHERE yuvish_tanlovi_jadval nomidan_kerakli_maydonlar nomini TANlang

Hamma narsa juda oddiy va ahamiyatsiz, lekin

Bir nechta jadvallardan tanlovlar Bu yanada murakkablashmoqda..

Qiyinchiliklardan biri bu maydonlarning nomlaridan qochishdir. Masalan, har bir jadvalda maydon mavjud id Agar biz bir xil jadvaldan tanlov qilsak, hamma narsa juda oddiy bo'lar edi: Keling, ushbu savolni ko'rib chiqaylik: Masalan, har bir jadvalda maydon mavjud TANLOV * jadval_1, jadval_2 WHERE table_1.id > table_2.user_id Bunday savollar bilan shug'ullanmaganlar uchun hamma narsa oddiyroq ko'rinadi, chunki ular jadval nomini maydonlar nomlaridan oldin olgan deb o'ylashgan. Darhaqiqat, u turli soha nomlarini farqlashga imkon bermaydi. Biroq, katlanuvchanlik kimda emas, balki SQL so'roviga o'xshash algoritm Agar biz bir xil jadvaldan tanlov qilsak, hamma narsa juda oddiy bo'lar edi: Robotik hujum algoritmi: dan birinchi yozuvni oling Masalan, har bir jadvalda maydon mavjud jadval_1 . olingan yozuvlar. Masalan, har bir jadvalda maydon mavjud Keyingi iteratsiyada oldingi jadval yozuvi olinadi Bunday savollar bilan shug'ullanmaganlar uchun hamma narsa oddiyroq ko'rinadi, chunki ular jadval nomini maydonlar nomlaridan oldin olgan deb o'ylashgan.. Keling, yana butun jadvalni ko'rib chiqaylik, va yana aqldan so'raydi

table_1.id > table_2.user_id

. Qiuning fikrini qondiradigan barcha yozuvlar natijaga qo'shiladi. Chiqarish yana ko'plab yozuvlarni o'z ichiga olishi mumkin va ko'p marta ikkala jadvalning xulosasi bo'ladi. Agar siz birinchi marta qanday ishlashini tushunsangiz, bu juda zo'r, lekin agar tushunmasangiz, o'sha vaqtgacha o'qing, qolganlarini tushunolmaysiz. Siz tushunganingizdek, narsalar osonroq bo'ladi. Qiuning fikrini qondiradigan barcha yozuvlar natijaga qo'shiladi. Old SQL so'rovi bu kabi, u kamdan-kam hollarda muammoga duch keladi. Agar biz bir xil jadvaldan tanlov qilsak, hamma narsa juda oddiy bo'lar edi: Vín buv oddiygina uchun berilgan Agar biz bir xil jadvaldan tanlov qilsak, hamma narsa juda oddiy bo'lar edi: Bir qator jadvallardan tanlash algoritmini tushuntirish . Va endi ko'proq qo'shimchalarni ko'rib chiqaylik ..

Aytaylik, bizda ikkita jadval bor: tovarlar bilan (maydon owner_id

, ayniqsa uchun

vlasnik tovarlari) va koristuvachlar bilan (ê dala

). Biz bittasini xohlaymiz SQL so'rovi Agar biz bir xil jadvaldan tanlov qilsak, hamma narsa juda oddiy bo'lar edi: Har bir kishi xarid va bitta mahsulot haqida ma'lumotga ega bo'lishi uchun barcha yozuvlarni bekor qiling. Joriy yozuvda bir xil savdogar va joriy mahsulot haqida ma'lumot bor edi. O'rtoqning koristuvachi tugagach, keyingi koristuvachga o'ting. SQL so'rovi Shunday qilib, ikkita jadvalni birlashtirish va natijani chiqarish bizning vazifamizdir Agar biz bir xil jadvaldan tanlov qilsak, hamma narsa juda oddiy bo'lar edi: kozhen rekord joy koristuvach haqida ma'lumot va bir yogo mahsulot haqida Biz bittasini xohlaymiz Shunga o'xshash so'rov 2 SQL so'rovini almashtiradi

: tanlash uchun biz tovarlar bilan stoldan va savdogarlar bilan stoldan tanlaymiz. Bundan oldin, bunday so'rov darhol sotuvchining mol-mulkini va uning tovarlarini etkazib beradi. Savolning o'zi juda oddiy (siz oldin tushunganingizdek):

Keling, Internetdagi sayt o'rnini tekshirish bo'yicha eng mashhur xizmatlarni ko'rib chiqaylik, ularning ijobiy va salbiy tomonlarini ko'rib chiqaylik, shubhasiz...