- 1. Įvardijimo konvencija
- 2. Visada naudokite teisingą duomenų tipą
- 3. Naudokite CHAR (1) virš VARCHAR (1)
- 4. CHAR fiksuotiems duomenims
- 5. Venkite regioninių datų formatų
- 6. Optimizuokite talpyklos užklausas
- 7. Nenaudokite „SELECT *“ savo užklausose
- 8. Naudokite LIMIT 1, kai norite tik vienos eilutės
- 9. Naudojimas ***** BY
- 10. Pasirinkite tinkamą pagrindinį variklį
- 11. Jei reikia, naudokite sąlygą „EXISTS“
- 12. SELECT užklausose naudokite EXPLAIN
- 13. Indeksuokite ir naudokite to paties tipo stulpelius jungimams
- 14. Jei galite, nenaudokite NOT NULL
- 15. Fiksuoto dydžio lentelės (statinės) yra greitesnės
- 16. Vertikalus skaidymas
- 17. Saugo IP adresus kaip UNSIGNED INT
- 18. Sukurkite rodinius, kad supaprastintumėte įprastą naudojimą lentelėse
- 19. Nenaudoti ***** BY RAND ()
- 20. Optimizuokite WHERE sąlygą
„MySQL“ duomenų bazė tapo populiariausia atviro kodo santykių duomenų baze pasaulyje dėl savo didelio našumo, nuoseklumo, didelio patikimumo ir naudojimo paprastumo. Tačiau ši nauda, kurią ji mums siūlo, dažnai priklauso nuo to, kaip mes su ja dirbame.
Šioje pamokoje sužinosite keletą patarimų, kurie bus labai naudingi ir leis mums kuo geriau išnaudoti tiek programuotojo, tiek duomenų bazės administratoriaus požiūriu.
Kokią priemonę naudosime?„MySQL komandų pultas“] „MySQL“ turi programą, pavadintą tuo pačiu pavadinimu kaip ir duomenų bazė („mysql“), kuri naudojama duomenų bazei valdyti naudojant komandinę eilutę.
„Windows“Jis yra tokiame kataloge:
C: \ Program Files \ MySQL \ MySQL Server 5.6 \ bin
Katalogas gali skirtis, pavyzdžiui, jis gali būti C: disko šaknyje arba bet kurioje kitoje vietoje, kurioje galbūt įdiegėme „MySQL“. Norėdami pasiekti „MySQL“ konsolę sistemoje „Windows“, turėsime būti tame kataloge.
LinuxŽiūrėkite šią nuorodą:
Pasiekite „MySQL“ iš „Linux“
„Mac“Kompiuteriai su sistema „Mac OS X“ tarp galimų programų yra įmontuotas komandų eilutės terminalas. Prieigai naudojama ta pati komanda kaip ir „Linux“.
phpMyAdminTai nemokama programinė įranga, parašyta PHP, naudojama MySQL administravimui internetu. Jei turite įdiegtą vietinę kūrimo aplinką, pvz., XAMPP ar WAMP, šis įrankis jau bus įdiegtas. Jei turite prieglobos planą su administraciniu skydeliu, dauguma jų siūlo šį įrankį kaip „MySQL“ duomenų bazės administratorius.
[spalva = rgb (169 169 169)] phpMyAdmin iš XAMPP [/ spalva]
DIDELIS
[color = # a9a9a9] „phpMyAdmin“ iš „CPanel“ [/ spalva]
Turėdami po ranka šiuos du įrankius, galime pradėti išbandyti visą šią gerą praktiką, kurią parodome toliau.
Šitie yra 20 geriausių „MySQL“ praktikų:
1. Įvardijimo konvencija
Yra kiekvienos programavimo kalbos kodavimo standartai, tačiau „MySQL“ terminais neradome universalių kodavimo praktikų, kurių visi laikytųsi. Tačiau peržiūrėdami keletą atvirojo kodo sistemų, pagrįstų PHP, mes išfiltruojame kai kurias bendras taikymo taisykles, kurios padės mums greičiau parašyti SQL užklausas, pašalins painiavą ir konfliktus tiek užklausoje, tiek mūsų naudojama programavimo kalba.
Bendrosios taisyklėsKad išvengtumėte problemų, laikykitės šių taisyklių.
- Naudokite mažąsias raides, nes tai padeda greičiau įvesti tekstą, taip išvengsite klaidų, kai bus naudojamos mažosios ir didžiosios raidės ir pan.
- Nenaudokite tarpo, naudokite pabraukimą (_).
- Nenaudokite skaičių pavadinimuose, tik angliškus abėcėlės simbolius.
- Naudokite galiojančius suprantamus pavadinimus.
- Pavadinimai turėtų būti savaime suprantami.
- Pavadinimuose negali būti daugiau nei 64 simbolių.
- Venkite priešdėlių.
Duomenų bazių pavadinimų taisyklėsLaikykitės visų pirmiau pateiktų bendrųjų taisyklių.
- Pavadinimas gali būti vienaskaitinis ir daugiskaitos, tačiau duomenų bazė yra duomenų bazė, todėl ji turėtų būti kiek įmanoma vienakaita.
- Jei įmanoma, venkite priešdėlių.
Lentelių pavadinimų taisyklėsLentelių pavadinimams naudokite mažąsias raides: „MySQL“ paprastai priglobiama „Linux“ serveriuose, neskiriamos didžiosios ir mažosios raidės, todėl geriausia praktika yra mažųjų raidžių lentelių pavadinimai.
- Lentelių pavadinimai turi būti vienaskaitoje: lentelė yra vienas objektas, kaip ir modelis, todėl keista turėti lentelės pavadinimą daugiskaita.
- Priešdėliai lentelės pavadinime: Mes daug kartų matėme, kad lentelėse yra priešdėlis su duomenų bazės pavadinimu arba projekto pavadinimu. Kartais to reikia, kai savo projekte turime daug duomenų bazių, kad galėtume įveikti kai kurių prieglobos paslaugų teikėjų apribojimus. Bet jei tai nėra būtina ir mūsų projektas yra mažas, venkite priešdėlių.
Laukų pavadinimasNaudokite visas aukščiau pateiktas taisykles, tai yra naudokite mažąsias raides, nenaudokite tuščių tarpų, nenaudokite skaičių ir venkite priešdėlių.
- Jei įmanoma, naudokite vieną ar du trumpus žodžius.
- Laukų pavadinimus turi būti galima suprasti, pavyzdžiui: kaina, įmonės_pavadinimas ir kt.
- Pirminio stulpelio pavadinimas: pirminis raktas gali turėti ID pavadinimą arba lentelės pavadinimą _id. Tai priklausys nuo pasirinkimo.
- Venkite naudoti rezervuotus žodžius laukuose: *****, data ir kt. Tokiais atvejais pageidautina naudoti prefiksus, tokius kaip įrašo_data ir kt.
- Venkite naudoti stulpelių pavadinimus tuo pačiu lentelės pavadinimu. Tai gali sukelti painiavą rašant užklausas.
- Venkite pavadinimų sutrumpintuose arba sujungtuose akronimuose.
2. Visada naudokite teisingą duomenų tipą
Naudokite duomenų tipus pagal duomenų pobūdį. Naudojant nesvarbius duomenų tipus gali užimti daugiau vietos arba atsirasti klaidų.
PavyzdysNaudojant varchar (20) datos ir laiko reikšmėms saugoti vietoj DATETIME, gali atsirasti klaidų skaičiuojant su data susijusį laiką, taip pat tai įmanoma, jei duomenys saugomi netinkamai.
3. Naudokite CHAR (1) virš VARCHAR (1)
Jei išsaugojote vieną simbolių eilutę, naudoti CHAR (1) vietoj VARCHAR (1), nes VARCHAR (1) užims papildomą baitą informacijai išsaugoti. Į ką į tai atsižvelgti valdant šiuos simbolius.
4. CHAR fiksuotiems duomenims
Naudokite CHAR duomenis tik fiksuoto ilgio duomenims saugoti
Pavyzdys:
Naudojant CHAR (1000) vietoj VARCHAR (1000), sunaudojama daugiau vietos, jei duomenų ilgis yra mažesnis nei 1000.
5. Venkite regioninių datų formatų
Naudojant duomenų tipus:
- DATETIME
- DATA
Visada naudokite YYYY-MM-DD formatą arba ISO datos formatą, kuris tinka jūsų SQL varikliui. Kiti regioniniai formatai, pvz., DD-MM-YYY, DD-MM-YYYY, nebus tinkamai saugomi.
6. Optimizuokite talpyklos užklausas
dauguma „MySQL“ serveriuose įjungta talpyklos sistema. Tai vienas iš efektyviausių našumo gerinimo būdų, kuris gaunamas iš duomenų bazės variklio rankos. Kai ta pati užklausa vykdoma kelis kartus, rezultatas gaunamas iš talpyklos, o tai yra daug greičiau.
Šis pavyzdys yra PHP:
// Talpykla neveikia $ r = mysql_query ("SELECT name from users WHERE record> = CURDATE ()");
// Talpykla DARBO $ šiandien = data ("Y-m-d"); $ r = mysql_query ("SELECT name FROM users WHERE record> = '$ today'");Priežastis, kodėl ji neveikia pirmuoju atveju, yra ta, kad naudojama CURDATE (). Jis gali būti taikomas visoms nenustatytoms funkcijoms, tokioms kaip DABAR () ir RAND (). Kadangi funkcijos pateiktas rezultatas gali pasikeisti, „MySQL“ nusprendžia išjungti tos užklausos talpyklą.
7. Nenaudokite „SELECT *“ savo užklausose
Bendra taisyklė - kuo daugiau duomenų nuskaitoma iš lentelių, tuo lėčiau atliekama užklausa. Atsižvelgiant į tai, kad kai kuriose gamybos lentelėse gali būti dešimtys stulpelių, kai kuriuos sudaro dideli duomenų tipai, būtų neprotinga juos visus pasirinkti.
Tai geras įprotis nurodykite reikiamus stulpelius savo SELECT sakinyje.
8. Naudokite LIMIT 1, kai norite tik vienos eilutės
Kartais, kai klausiate savo lentelių ir žinote, kad jums reikia tik vienos eilutės. Tokiais atvejais turite prašyti vieno rezultato iš duomenų bazės, kitaip ji patikrins kiekvieną atitiktį WHERE sąlygoje.
Tokiais atvejais pridėjus LIMIT 1 prie užklausos galima žymiai pagerinti greitį. Tokiu būdu duomenų bazė nustos nuskaityti rezultatus, kai tik suras, o ne peržiūrės visą lentelę ar indeksą.
// Turiu vartotojų iš Madrido? // ko NEGALIMA daryti: $ r = mysql_query ("SELECT * FROM user WHERE city =‘ Madrid ’"); if (mysql_num_rows ($ r)> 0) {//…} // daug geriau: $ r = mysql_query („SELECT 1 FROM user WHERE city =‘ Madrid ’LIMIT 1“); jei (mysql_num_rows ($ r)> 0) {//…}[spalva = # a9a9a9]LIMIT rekomendacija[/Spalva]
9. Naudojimas ***** BY
Panaudojimas ***** PAGAL tai gali sulėtinti atsako laiką kelių vartotojų aplinkoje. Taigi mes rekomenduojame ***** BY sąlygą naudoti tik tada, kai tai būtina.
Nepiktnaudžiaukite jo naudojimu.
10. Pasirinkite tinkamą pagrindinį variklį
Jei kuriate programą, kuri dažniau skaito duomenis nei rašo.
(pavyzdžiui: paieškos variklis), pasirinkite „MyISAM“ saugojimo variklį.
Jei kuriate programą, kuri duomenis rašo dažniau nei skaitydama
(pavyzdžiui: bankininkystė realiuoju laiku), pasirinkite „InnoDB“ saugojimo variklį.
Jei pasirinksite netinkamą saugojimo variklį, tai turės įtakos jūsų užklausų veikimui.
11. Jei reikia, naudokite sąlygą „EXISTS“
Jei norite patikrinti duomenis, nenaudokite:
Jei [SELECT count (*) from the Table WHERE col = 'some value']> 0Vietoj to naudokite sąlygą EXISTS:
Jei ESAMA (PASIRINKITE * iš lentelės WHERE col = 'tam tikra vertė')Kuris greičiau reaguoja.
12. SELECT užklausose naudokite EXPLAIN
Naudodami EXPLAIN raktinį žodį gausite daug vidinės informacijos apie tai, ką „MySQL“ daro, kad įvykdytų jūsų užklausą. Tai gali padėti pastebėti kliūtis ir kitas jūsų užklausos ar lentelės struktūros problemas.
EXPLAIN užklausos rezultatas parodys naudojamus indeksus, kaip tiriama lentelė, kaip ji užsakoma ir pan.
Pasirinkite SELECT užklausą (pageidautina sudėtingą, su sujungimais) ir visko pradžioje pridėkite žodį EXPLAIN. Rezultatai bus pateikti paprastoje lentelėje. Pvz., Tarkime, aš pamiršau indeksuoti stulpelį, jis parodys mums šį ekraną:
DIDELIS
Pridėjus indeksą prie būsenos lentelės, jis atrodytų taip:
DIDELIS
13. Indeksuokite ir naudokite to paties tipo stulpelius jungimams
Jei jūsų programoje yra daug JOIN teiginių, turite įsitikinti, kad stulpeliai, prie kurių prisijungiate, yra indeksuojami abiejose lentelėse. Tai turi įtakos tam, kaip MySQL optimizuoja viduje JOIN operacijos.
Be to, stulpeliai, prie kurių jungiatės, turi būti to paties tipo. Pavyzdžiui, jei jungiate DECIMAL tipo stulpelį su INT tipo stulpeliu iš kitos lentelės, „MySQL“ negalės naudoti bent vieno iš dviejų indeksų. Net simbolių kodavimas turi būti to paties tipo stulpeliuose Stygos tipas.
// ieškau įmonių savo mieste $ r = mysql_query ("SELECT company_name FROM users LEFT JOIN JUNGTI įmones ON (users.city = companyias.city) WHERE users.id = $ user_id");Abu miesto stulpeliai turi būti indeksuojami ir abu turi būti to paties tipo ir simbolių kodavimo, kitaip „MySQL“ turės atlikti visą lentelių nuskaitymą.
14. Jei galite, nenaudokite NOT NULL
Jei neturite konkrečios priežasties naudoti NULL reikšmės, visada nustatykite stulpelius į NOT NULL.
Pirmiausia paklauskite savęs, ar būtų skirtumas tarp tuščios eilutės ir NULL reikšmės (arba INT laukų: 0 prieš NULL). Jei tarp dviejų verčių nėra problemų, jums nereikia lauko NULL. NULL stulpeliams reikia papildomos vietos ir jie gali papildyti jūsų palyginimo teiginius. Tiesiog venkite jų, kai tik galite.
Bet kokiu atveju mes suprantame, kad kai kuriais labai konkrečiais atvejais yra priežastis naudoti NULL stulpelius, o tai ne visada yra blogai.
15. Fiksuoto dydžio lentelės (statinės) yra greitesnės
Kai kiekvienas lentelės stulpelis yra fiksuoto ilgio, visa lentelė laikoma „statine“ arba „fiksuoto ilgio“.
Kai kurie stulpelių tipų, kurie nėra fiksuoto dydžio, pavyzdžiai:
- VARCHAR
- TEKSTAS
- BLOB
Jei įtraukiate tik vieną iš šių stulpelių tipų, lentelė nebebus fiksuoto dydžio ir ją turės skirtingai traktuoti „MySQL“ variklis.
Fiksuoto dydžio lentelės gali padidinti našumą, nes „MySQL“ variklis greičiau ieško jūsų įrašų. Jei norite perskaityti konkrečią lentelės eilutę, galite greitai apskaičiuoti jos padėtį. Jei eilutės dydis nėra fiksuotas, kiekvieną kartą, kai turite ieškoti, pirmiausia turite užklausti pirminio rakto indeksą.
Juos taip pat lengviau ieškoti ir atstatyti po avarijos. Tačiau, kita vertus, jie taip pat galėtų užimti daugiau vietos.
16. Vertikalus skaidymas
Vertikalus skaidymas - tai lentelės struktūros atskyrimas vertikaliai dėl optimizavimo priežasčių.
1 pavyzdys:
Tikrai turėsite naudotojų lentelę, kurioje yra pašto adresas, kuris nėra labai dažnai naudojamas. Čia galite padalinti lentelę ir išsaugoti adresus atskiroje lentelėje. Tokiu būdu jūsų pagrindinė vartotojo lentelė būtų griežtesnė. Kaip žinote, kuo mažesnis, tuo greičiau stalai.
2 pavyzdys:
Lentelėje yra laukas „last_access“. Jis atnaujinamas kiekvieną kartą, kai vartotojas pasiekia jūsų puslapį. Bet kiekviena prieiga sukelia tos lentelės užklausos talpyklos atlaisvinimą. Ką galite padaryti, tai įdėti šį lauką į kitą lentelę, kad jūsų vartotojo lentelės pakeitimai būtų kuo mažesni.
Bet jūs taip pat turite įsitikinti, kad po skaidymo jums nereikia nuolat prisijungti prie dviejų lentelių, kitaip patirsite našumo sumažėjimą, priešingai nei mes ieškojome.
17. Saugo IP adresus kaip UNSIGNED INT
Daugelis programuotojų sukurtų VARCHAR laukas (15) nesuvokdami, kad jie gali saugoti IP adresus kaip sveikus skaičius. Kai naudojate INT, atmintyje naudojate tik 4 baitus, o lentelėje taip pat yra fiksuotas dydis.
Bet jūs turite įsitikinti, kad stulpelis yra NEPRASTA INT (nepasirašytas sveikasis skaičius), nes IP adresai naudoja visą 32 bitų nepasirašytą diapazoną.
Savo užklausose galite naudoti INET_ATON () funkcija konvertuoti IP adresą į sveiką skaičių, o INET_NTOA () padaryti priešingai. PHP taip pat turi panašių funkcijų, vadinamų ip2long () Y long2ip ().
18. Sukurkite rodinius, kad supaprastintumėte įprastą naudojimą lentelėse
Rodiniai padeda supaprastinti sudėtingas schemas ir įdiegti saugumą. Vienas iš būdų, kaip jie prisideda prie saugos dalies, yra tai, kad tai leidžia slėpti laukų pavadinimus nuo kūrėjų.
Jis taip pat gali būti naudojamas filtruoti neindeksuotus stulpelius, paliekant tik tuos laukus, kurie paieškoje rodomi greičiau.
19. Nenaudoti ***** BY RAND ()
Tai vienas iš tų triukų, kuris iš pirmo žvilgsnio skamba puikiai ir kur daug pradedančių programuotojų linkę kristi. Galbūt nesuvokėte neįtikėtinos kliūties, kurią gali sukelti šios technikos naudojimas jūsų prašymuose.
Jei jūsų rezultatui tikrai reikia atsitiktinių lentelių, yra daug geresnių būdų tai padaryti. Akivaizdu, kad jie užims daugiau kodo, tačiau jūs užkirsite kelią galimai kliūčiai, kuri didės eksponentiškai, augant jūsų turiniui.
Problema ta, kad „MySQL“ turės veikti RAND () (tam reikia apdorojimo galios) kiekvienai eilutei prieš jas rūšiuojant ir grąžinant vieną eilutę.
// būdas to nedaryti: $ r = mysql_query ("SELECT username FROM user ***** BY RAND () LIMIT 1"); // daug geriau: $ r = mysql_query ("SELECT count (*) FROM user"); $ d = mysql_fetch_row ($ r); $ rand = mt_rand (0, $ d [0] - 1); $ r = mysql_query ("PASIRINKITE vartotojo vardą iš vartotojo vardo LIMIT $ rand, 1");Taigi jūs pasirenkate atsitiktinį skaičių, mažesnį už rezultatų skaičių, ir naudojate jį kaip poslinkį LIMIT sąlygoje.
20. Optimizuokite WHERE sąlygą
Tai yra keletas patarimai, kaip optimizuoti sąlygą WHERE:
- Pašalinkite nereikalingus skliaustus. Pavyzdžiui:
Iš į5 IR b = c IR a = 5
- COUNT (*) jis yra optimizuotas, kad SELECT būtų grąžintas daug greičiau, kol jis yra prie stalo ir nenaudojant WHERE. Pavyzdžiui:
SELECT COUNT (*) FROM lentelėje.
- The SQL_SMALL_RESULT parinktis, galima naudoti su GRUPUOTI PAGAL arba SKIRTIS parodyti, kad rezultatų rinkinys yra mažas. Šiuo atveju „MySQL“ naudoja labai greitas laikinas lenteles, kad gautą lentelę saugotų, o ne naudotų rūšiavimą.
„MySQL“ vadovėliai