6.1 Panimula

Ngayon lumipat tayo mula sa teorya patungo sa pagsasanay.

"Sa teorya, walang pagkakaiba sa pagitan ng teorya at kasanayan. Sa praktis, sila."

Nabubuhay tayo sa totoong mundo at lahat ng produkto ng software ay ganap na nilikha para sa mga buhay na tao. At ang mga buhay na taong ito ay labis na naiinis sa mga site na mabagal na naglo-load, at mga programang bumabagal.

At kung ang isang query sa database ay tumatagal ng higit sa isang segundo, ito ay hindi katanggap-tanggap . Ang mga user ay hindi gagamit ng isang produkto na may mga page/functionality na napakabagal.

Ngunit madalas, upang maipakita ang isang pahina, kailangan mong magsagawa ng ilang dosenang mga query sa database. At kung sunud-sunod na ipapatupad ang mga ito, wala ka nang pangalawang limitasyon, ngunit sabihin nating 100ms bawat kahilingan.

Narito ang nangungunang 5 paraan na pinapabilis ng mga programmer ang mga query sa database:

  1. Pagdaragdag ng mga index sa mga talahanayan sa database.
  2. Muling pagsusulat at pag-optimize ng mga query.
  3. Paganahin (at i-configure) ang pag-cache sa gilid ng database.
  4. Paganahin ang pag-cache sa panig ng kliyente.
  5. Nagsasagawa ng database denormalization.

Pamilyar ka na sa lahat ng mga bagay na ito sa karamihan, kaya ang mga sumusunod ay magiging praktikal na payo lamang.

6.2 Mga Index

Hindi lihim na ang pagtatrabaho sa isang database ay tumatagal ng halos lahat ng gawain ng halos anumang site. At ito ay gumagana sa database na kadalasang ang bottleneck ng mga web application.

Sa artikulong ito nais kong magbigay ng praktikal na payo sa paggamit ng MySQL.

Sasabihin ko kaagad:

  • ang artikulong ito ay isinulat tungkol sa MySQL, kahit na ang mga pangkalahatang bagay ay malamang na totoo para sa anumang DBMS.
  • lahat ng nakasulat sa artikulo ay ang aking personal na pananaw, at hindi ito ang tunay na katotohanan.
  • ang payo ay hindi nagkukunwaring bago at ito ay bunga ng paglalahat ng babasahin at personal na karanasan.
  • sa loob ng balangkas ng artikulong ito, hindi ko hawakan ang mga isyu sa pagsasaayos ng MySQL.

Ang mga problema kapag gumagamit ng MySQL ay maaaring nahahati sa sumusunod na tatlong grupo (sa pagkakasunud-sunod ng kahalagahan):

  1. Hindi paggamit o maling paggamit ng mga index.
  2. Maling istraktura ng database.
  3. Maling \ suboptimal na mga query sa SQL.

Tingnan natin ang bawat isa sa mga pangkat na ito.

Paggamit ng mga Index

Ang hindi paggamit o maling paggamit ng mga index ang kadalasang nagpapabagal sa mga query. Para sa mga hindi pamilyar sa mekanismo kung paano gumagana ang mga index o hindi pa nababasa ang tungkol dito sa manwal, mariing ipinapayo ko sa iyo na basahin ito.

Mga tip para sa paggamit ng mga index:

  • Hindi mo kailangang i-index ang lahat . Kadalasan, nang hindi nauunawaan ang kahulugan, ini-index lamang ng mga tao ang lahat ng mga patlang ng isang talahanayan. Pinapabilis ng mga index ang pagkuha, ngunit pabagalin ang mga pagsingit at pag-update ng row, kaya dapat na makabuluhan ang pagpili ng bawat index.
  • Ang isa sa mga pangunahing parameter na nagpapakilala sa index ay ang selectivity, na kung saan ay ang bilang ng iba't ibang elemento sa index. Walang saysay na i-index ang isang field na may dalawa o tatlong posibleng halaga. Magkakaroon ng kaunting benepisyo mula sa naturang index.
  • Ang pagpili ng mga index ay dapat magsimula sa isang pagsusuri ng lahat ng mga query laban sa isang ibinigay na talahanayan. Kadalasan, pagkatapos ng naturang pagsusuri, sa halip na tatlo o apat na mga indeks, maaari kang gumawa ng isang pinagsama-samang isa.
  • Kapag gumagamit ng mga composite index, ang pagkakasunud-sunod ng mga field sa index ay kritikal.
  • Huwag kalimutan ang tungkol sa pagsakop sa mga index. Kung ang lahat ng data sa isang query ay maaaring makuha mula sa isang index, pagkatapos ay hindi direktang maa-access ng MySQL ang talahanayan. Ang mga naturang kahilingan ay isasagawa nang napakabilis. Halimbawa, para sa isang query SELECT name FROM user WHERE login='test'na may index (login, pangalan), hindi kinakailangan ang access sa talahanayan. Minsan makatuwirang magdagdag ng karagdagang field sa isang composite index, na gagawing cover ng index at pabilisin ang mga query.
  • Para sa mga index ng row, kadalasan ay sapat na ang pag-index lamang ng bahagi ng row. Ito ay maaaring makabuluhang bawasan ang laki ng index.
  • Kung %ito ay sa simula, LIKE(SELECT * FROM table WHERE field LIKE '%test')ang mga index ay hindi gagamitin.
  • Ang FULLTEXT index ay ginagamit lamang sa MATCH ... AGAINST syntax .

6.3 Istraktura ng database

Ang isang mahusay na dinisenyo na database ay ang susi sa mabilis at mahusay na trabaho sa database. Sa kabilang banda, ang isang database na hindi maganda ang disenyo ay palaging isang sakit ng ulo para sa mga developer.

Mga tip sa disenyo ng database:

  1. Gamitin ang pinakamaliit na posibleng uri ng data. Kung mas malaki ang uri ng data, mas malaki ang talahanayan, mas maraming pag-access sa disk ang kailangan upang makuha ang data. Gumamit ng isang napaka-maginhawang pamamaraan: SELECT * FROM table_name PROCEDURE ANALYSE();upang matukoy ang pinakamababang posibleng uri ng data.
  2. Obserbahan ang mga normal na anyo sa yugto ng disenyo. Kadalasan ang mga programmer ay gumagamit ng denormalization na nasa yugtong ito. Gayunpaman, sa karamihan ng mga kaso, sa simula ng proyekto, ito ay malayo mula sa halata kung paano ito maaaring magresulta. Ang pag-denormalize ng isang table ay mas madali kaysa sa pagdurusa mula sa isang sub-optimally denormalized isa. At JOINkung minsan ito ay gumagana nang mas mabilis kaysa sa mga maling denormalized na talahanayan.
  3. Huwag gumamit NULLng mga column maliban kung sinasadya mo ang mga ito.

6.4 Mga query sa SQL.

Kung gaano kadalas mayroong pagnanais na muling isulat ang lahat ng mga query sa katutubong SQL upang ang query ay mas mabilis hangga't maaari. Kung magpasya kang gawin ito, narito ang ilang mga tip:

  1. Iwasan ang mga kahilingan sa isang loop. Ang SQL ay isang wika ng mga set, at ang pagsusulat ng mga query ay dapat lapitan hindi sa wika ng mga function, ngunit sa wika ng mga set.
  2. Iwasan ang *(mga asterisk) sa mga query. Huwag mag-atubiling ilista nang eksakto ang mga field na pipiliin mo. Babawasan nito ang dami ng data na kinukuha at ipinadala. Gayundin, huwag kalimutan ang tungkol sa pagsakop sa mga index. Kahit na piliin mo ang lahat ng mga patlang sa talahanayan, mas mahusay na ilista ang mga ito. Una , pinapabuti nito ang pagiging madaling mabasa ng code. Kapag gumagamit ng mga asterisk, imposibleng malaman kung anong mga patlang ang nasa talahanayan nang hindi tinitingnan ito. Pangalawa , ngayon ang iyong talahanayan ay may limang INT column, at makalipas ang isang buwan isa pang TEXT at BLOB ang idinagdag , at ang asterisk ay nanatili sa dati.
  3. Kapag na-paginate, upang makuha ang kabuuang bilang ng mga tala, gamitin SQL_CALC_FOUND_ROWSat SELECT FOUND_ROWS();Kapag ginamit SQL_CALC_FOUND_ROWS MySQL, ini-cache ang napiling bilang ng mga row (bago ilapat ang LIMIT), at kapag ginamit, SELECT FOUND_ROWS()ibinabalik lamang ang naka-cache na halaga na ito nang hindi kinakailangang muling isagawa ang query.
  4. Huwag kalimutan na mayroong INSERTisang syntax para sa maraming pagsingit. Ang isang query ay tatakbo ng isang order ng magnitude na mas mabilis kaysa sa maraming mga query sa isang loop.
  5. Gamitin LIMITkung saan hindi mo kailangan ang lahat ng data.
  6. Gamitin INSERT… ON DUPLICATE KEY UPDATE…bilang kapalit at INSERTo UPDATEpagkatapos ng pagpili, at madalas bilang kapalit ng REPLACE.
  7. Huwag kalimutan ang kamangha-manghang tampok na ito GROUP_CONCAT. Makakatulong ito sa mga kumplikadong query.