6.1 Pengenalan

Sekarang mari kita beralih dari teori kepada amalan.

“Secara teori, tidak ada perbezaan antara teori dan amalan. Dalam amalan, mereka adalah."

Kita hidup di dunia nyata dan semua produk perisian akhirnya dicipta untuk orang yang masih hidup. Dan orang yang hidup ini sangat marah dengan tapak yang dimuatkan dengan perlahan, dan program yang perlahan.

Dan jika pertanyaan pangkalan data mengambil masa lebih daripada satu saat, ini tidak boleh diterima . Pengguna tidak akan menggunakan produk yang mempunyai halaman/fungsi yang sangat perlahan.

Tetapi selalunya, untuk memaparkan satu halaman, anda perlu melakukan beberapa dozen pertanyaan ke pangkalan data. Dan jika ia dilaksanakan secara berurutan, maka anda tidak lagi mempunyai had kedua, tetapi katakan 100ms setiap permintaan.

Berikut ialah 5 cara terbaik pengaturcara mempercepatkan pertanyaan pangkalan data:

  1. Menambah indeks pada jadual dalam pangkalan data.
  2. Menulis semula dan mengoptimumkan pertanyaan.
  3. Dayakan (dan konfigurasikan) caching pada bahagian pangkalan data.
  4. Dayakan caching pada bahagian klien.
  5. Melakukan penyahnormalan pangkalan data.

Anda sudah biasa dengan semua perkara ini untuk sebahagian besar, jadi yang berikut hanya akan menjadi nasihat praktikal.

6.2 Indeks

Bukan rahsia lagi bahawa bekerja dengan pangkalan data memerlukan kebanyakan kerja hampir mana-mana tapak. Dan ia berfungsi dengan pangkalan data yang paling kerap menjadi kesesakan aplikasi web.

Dalam artikel ini saya ingin memberikan nasihat praktikal tentang menggunakan MySQL.

Saya akan berkata dengan segera:

  • artikel ini ditulis tentang MySQL, walaupun perkara umum mungkin benar untuk mana-mana DBMS.
  • semua yang ditulis dalam artikel itu adalah pandangan peribadi saya, dan bukan kebenaran muktamad.
  • nasihat tidak berpura-pura baru dan merupakan hasil generalisasi kesusasteraan yang dibaca dan pengalaman peribadi.
  • dalam rangka artikel ini, saya tidak akan menyentuh isu konfigurasi MySQL.

Masalah semasa menggunakan MySQL boleh dibahagikan kepada tiga kumpulan berikut (mengikut kepentingan):

  1. Tidak menggunakan atau menyalahgunakan indeks.
  2. Struktur pangkalan data yang salah.
  3. Pertanyaan SQL suboptimum \ tidak betul.

Mari kita lihat lebih dekat setiap kumpulan ini.

Menggunakan Indeks

Tidak menggunakan atau menyalahgunakan indeks ialah perkara yang paling kerap memperlahankan pertanyaan. Bagi mereka yang tidak biasa dengan mekanisme bagaimana indeks berfungsi atau belum membaca tentangnya dalam manual, saya sangat menasihati anda untuk membacanya.

Petua untuk menggunakan indeks:

  • Anda tidak perlu mengindeks semuanya . Selalunya, tanpa memahami maksudnya, orang hanya mengindeks semua medan jadual. Indeks mempercepatkan pengambilan, tetapi memperlahankan sisipan baris dan kemas kini, jadi pilihan setiap indeks mestilah bermakna.
  • Salah satu parameter utama yang mencirikan indeks ialah selektiviti, iaitu bilangan elemen berbeza dalam indeks. Tidak masuk akal untuk mengindeks medan yang mempunyai dua atau tiga nilai yang mungkin. Akan ada sedikit manfaat daripada indeks sedemikian.
  • Pilihan indeks harus bermula dengan analisis semua pertanyaan terhadap jadual tertentu. Selalunya, selepas analisis sedemikian, bukannya tiga atau empat indeks, anda boleh membuat satu komposit.
  • Apabila menggunakan indeks komposit, susunan medan dalam indeks adalah kritikal.
  • Jangan lupa tentang meliputi indeks. Jika semua data dalam pertanyaan boleh diambil daripada indeks, maka MySQL tidak akan mengakses jadual secara langsung. Permintaan sedemikian akan dilaksanakan dengan cepat. Sebagai contoh, untuk pertanyaan SELECT name FROM user WHERE login='test'dengan indeks (log masuk, nama), akses kepada jadual tidak diperlukan. Kadangkala masuk akal untuk menambah medan tambahan pada indeks komposit, yang akan membuat penutup indeks dan mempercepatkan pertanyaan.
  • Untuk indeks baris, selalunya mencukupi untuk mengindeks hanya sebahagian daripada baris. Ini boleh mengurangkan saiz indeks dengan ketara.
  • Jika %ia pada permulaan, LIKE(SELECT * FROM table WHERE field LIKE '%test')indeks tidak akan digunakan.
  • Indeks FULLTEXT hanya digunakan dengan sintaks MATCH ... AGAINST .

6.3 Struktur pangkalan data

Pangkalan data yang direka dengan baik adalah kunci kepada kerja yang pantas dan cekap dengan pangkalan data. Sebaliknya, pangkalan data yang direka dengan buruk sentiasa menyusahkan pembangun.

Petua reka bentuk pangkalan data:

  1. Gunakan jenis data terkecil yang mungkin. Lebih besar jenis data, lebih besar jadual, lebih banyak akses cakera diperlukan untuk mendapatkan data. Gunakan prosedur yang sangat mudah: SELECT * FROM table_name PROCEDURE ANALYSE();untuk menentukan jenis data minimum yang mungkin.
  2. Perhatikan bentuk normal semasa fasa reka bentuk. Selalunya pengaturcara menggunakan denormalisasi sudah pada peringkat ini. Walau bagaimanapun, dalam kebanyakan kes, pada permulaan projek, adalah jauh dari jelas bagaimana ini boleh terhasil. Menyahnormalkan jadual adalah lebih mudah daripada mengalami jadual yang tidak normal secara suboptimum. Dan JOINkadangkala ia berfungsi lebih pantas daripada jadual yang tidak normal.
  3. Jangan gunakan NULLlajur melainkan anda memerlukannya secara sedar.

6.4 Pertanyaan SQL.

Sama seperti kerap terdapat keinginan untuk menulis semula semua pertanyaan dalam SQL asli supaya pertanyaan itu secepat mungkin. Jika anda memutuskan untuk melakukan ini, maka berikut adalah beberapa petua:

  1. Elakkan permintaan dalam gelung. SQL ialah bahasa set, dan pertanyaan penulisan harus didekati bukan dalam bahasa fungsi, tetapi dalam bahasa set.
  2. Elakkan *(tanda bintang) dalam pertanyaan. Sila senaraikan dengan tepat medan yang anda pilih. Ini akan mengurangkan jumlah data yang diambil dan dihantar. Juga, jangan lupa tentang meliputi indeks. Walaupun anda memilih semua medan dalam jadual, adalah lebih baik untuk menyenaraikannya. Pertama , ia meningkatkan kebolehbacaan kod. Apabila menggunakan asterisk, adalah mustahil untuk mengetahui medan yang terdapat dalam jadual tanpa melihatnya. Kedua , hari ini jadual anda mempunyai lima lajur INT , dan sebulan kemudian satu lagi TEXT dan BLOB telah ditambahkan , dan asterisk kekal seperti sedia ada.
  3. Apabila dinomborkan, untuk mendapatkan jumlah bilangan rekod, gunakan SQL_CALC_FOUND_ROWSdan SELECT FOUND_ROWS();Apabila digunakan SQL_CALC_FOUND_ROWS MySQL, cache bilangan baris yang dipilih (sebelum LIMIT digunakan), dan apabila digunakan, SELECT FOUND_ROWS()hanya mengembalikan nilai cache ini tanpa perlu melaksanakan semula pertanyaan.
  4. Jangan lupa bahawa terdapat INSERTsintaks untuk berbilang sisipan. Satu pertanyaan akan menjalankan susunan magnitud lebih cepat daripada berbilang pertanyaan dalam satu gelung.
  5. Gunakan LIMITtempat yang anda tidak perlukan semua data.
  6. Gunakan INSERT… ON DUPLICATE KEY UPDATE…sebagai ganti dan INSERTatau UPDATEselepas pemilihan, dan selalunya sebagai ganti REPLACE.
  7. Jangan lupa ciri hebat ini GROUP_CONCAT. Ia boleh membantu dengan pertanyaan yang rumit.