6.1 Pambuka

Saiki ayo pindhah saka teori menyang praktik.

"Ing teori, ora ana bedane antarane teori lan praktik. Ing laku, padha."

Kita manggon ing jagad nyata lan kabeh produk piranti lunak pungkasane digawe kanggo wong urip. Lan wong-wong sing urip iki banget pegel dening situs sing mbukak alon, lan program sing alon mudhun.

Lan yen query database njupuk luwih saka detik, iki ora bisa ditampa . Pangguna mung ora bakal nggunakake produk sing nduweni kaca/fungsi sing alon banget.

Nanging asring, kanggo nampilake siji kaca, sampeyan kudu nindakake pirang-pirang pitakon menyang database. Lan yen dieksekusi kanthi urutan, sampeyan ora duwe watesan liyane, nanging umpamane 100ms saben panyuwunan.

Mangkene 5 cara paling ndhuwur programer nyepetake pitakon database:

  1. Nambah indeks menyang tabel ing database.
  2. Nulis ulang lan ngoptimalake pitakon.
  3. Aktifake (lan ngatur) cache ing sisih database.
  4. Aktifake cache ing sisih klien.
  5. Nindakake denormalisasi database.

Sampeyan wis ngerti kabeh babagan iki, mula ing ngisor iki mung bakal dadi saran praktis.

6.2 Indeks

Ora ana rahasia manawa nggarap database njupuk akeh karya ing meh kabeh situs. Lan nggarap database sing paling kerep dadi bottleneck aplikasi web.

Ing artikel iki aku pengin menehi saran praktis babagan nggunakake MySQL.

Aku bakal ngomong langsung:

  • artikel iki ditulis babagan MySQL, sanajan umume umume bener kanggo DBMS apa wae.
  • kabeh sing ditulis ing artikel punika sudut pandang pribadi, lan ora bebener pokok.
  • pitutur ora nyamar dadi anyar lan minangka asil generalisasi saka sastra sing diwaca lan pengalaman pribadi.
  • ing kerangka artikel iki, aku ora bakal ndemek masalah konfigurasi MySQL.

Masalah nalika nggunakake MySQL bisa dipérang dadi telung klompok ing ngisor iki (ing urutan wigati):

  1. Non-nggunakake utawa nyalahi panggunaan indeks.
  2. Struktur database sing salah.
  3. Salah \ pitakon SQL suboptimal.

Ayo padha nliti saben kelompok kasebut.

Nggunakake Indeks

Ora nggunakake utawa nyalahi panggunaan indeks yaiku sing paling asring nyuda pitakon. Kanggo sing ora ngerti mekanisme kerjane indeks utawa durung maca babagan manual, aku menehi saran supaya maca.

Tip kanggo nggunakake indeks:

  • Sampeyan ora perlu ngindeks kabeh . Cukup asring, tanpa mangerteni makna, wong mung ngindeks kabeh kolom tabel. Indeks nyepetake njupuk, nanging alon-alon sisipan lan nganyari baris, dadi pilihan saben indeks kudu migunani.
  • Salah sawijining paramèter utama sing dadi ciri indeks yaiku selektivitas, yaiku jumlah unsur sing beda ing indeks. Ora ana pangertèn kanggo ngindeks lapangan sing nduweni loro utawa telung nilai sing bisa ditindakake. Bakal ana sethithik entuk manfaat saka indeks kasebut.
  • Pilihan indeks kudu diwiwiti kanthi analisis kabeh pitakon marang tabel tartamtu. Asring banget, sawise analisa kasebut, tinimbang telu utawa papat indeks, sampeyan bisa nggawe siji komposit.
  • Nalika nggunakake indeks komposit, urutan kolom ing indeks kasebut kritis.
  • Aja lali babagan nutupi indeks. Yen kabeh data ing pitakonan bisa dijupuk saka indeks, banjur MySQL ora bakal ngakses tabel langsung. Panjaluk kasebut bakal ditindakake kanthi cepet. Contone, kanggo pitakon SELECT name FROM user WHERE login='test'kanthi indeks (login, jeneng), akses menyang tabel ora dibutuhake. Kadhangkala ana akal kanggo nambah kolom tambahan menyang indeks komposit, sing bakal nggawe tutup indeks lan nyepetake pitakon.
  • Kanggo indeks baris, asring cukup kanggo ngindeks mung bagean saka baris. Iki bisa nyuda ukuran indeks kanthi signifikan.
  • Yen %ing wiwitan, LIKE(SELECT * FROM table WHERE field LIKE '%test')indeks ora bakal digunakake.
  • Indeks FULLTEXT mung digunakake nganggo sintaks MATCH ... AGAINST .

6.3 Struktur database

Database sing dirancang kanthi apik minangka kunci kanggo nggarap database kanthi cepet lan efisien. Ing sisih liya, basis data sing dirancang kanthi apik mesthi dadi pusing kanggo pangembang.

Tips desain database:

  1. Gunakake jinis data sing paling cilik. Sing luwih gedhe jinis data, luwih gedhe tabel, luwih akeh akses disk sing dibutuhake kanggo entuk data kasebut. Gunakake prosedur sing trep banget: SELECT * FROM table_name PROCEDURE ANALYSE();kanggo nemtokake jinis data minimal.
  2. Mirsani wangun normal sajrone fase desain. Asring programer nggunakake denormalisasi ing tahap iki. Nanging, ing pirang-pirang kasus, ing wiwitan proyek, ora jelas kepiye carane bisa nyebabake. Denormalisasi tabel luwih gampang tinimbang ngalami denormalisasi kanthi suboptimal. Lan JOINkadhangkala bisa luwih cepet tinimbang tabel denormalisasi sing salah.
  3. Aja nggunakake NULLkolom kajaba sampeyan kanthi sadar mbutuhake.

6.4 pitakon SQL.

Kaya asring ana kepinginan kanggo nulis ulang kabeh pitakon ing SQL asli supaya pitakon kasebut cepet-cepet. Yen sampeyan arep nindakake iki, banjur ana sawetara tips:

  1. Ngindhari panjalukan ing daur ulang. SQL minangka basa set, lan pitakon nulis kudu dicedhaki ora ing basa fungsi, nanging ing basa set.
  2. Ngindhari *(tanda bintang) ing pitakon. Bebas bae kanggo dhaptar persis kolom sing sampeyan pilih. Iki bakal nyuda jumlah data sing dijupuk lan dikirim. Uga, aja lali babagan nutupi indeks. Sanajan sampeyan milih kabeh kolom ing tabel, luwih apik kanggo dhaptar. Kaping pisanan , nambah keterbacaan kode kasebut. Nalika nggunakake tanda bintang, ora bisa ngerteni apa kolom ing tabel tanpa ndeleng. Kapindho , dina iki tabel sampeyan duwe limang kolom INT , lan sewulan mengko siji TEXT lan BLOB ditambahake , lan tanda bintang tetep kaya saiki.
  3. Nalika paginated, kanggo njaluk nomer total cathetan, nggunakake SQL_CALC_FOUND_ROWSlan SELECT FOUND_ROWS();Nalika digunakake SQL_CALC_FOUND_ROWS MySQL, caches nomer dipilih saka larik (sadurunge LIMIT diterapake), lan nalika digunakake, SELECT FOUND_ROWS()mung ngasilake Nilai cached iki tanpa kudu maneh nglakokaké query.
  4. Aja lali yen ana INSERTsintaks kanggo macem-macem sisipan. Siji pitakon bakal mbukak urutan gedhene luwih cepet tinimbang pirang-pirang pitakon ing siji daur ulang.
  5. Gunakake LIMITing ngendi sampeyan ora mbutuhake kabeh data.
  6. Gunakake INSERT… ON DUPLICATE KEY UPDATE…ing panggonan lan INSERTutawa UPDATEsawise pilihan, lan asring ing panggonan REPLACE.
  7. Aja lali fitur apik tenan iki GROUP_CONCAT. Bisa mbantu pitakon rumit.