Back to Question Center
0

Kumaha ngaoptimalkeun SQL queries pikeun loka gancang Kumaha ngaoptimalkeun SQL queries pikeun loka gancang Topik keywords: Debugging & Semalt

1 answers:
Kumaha ngaoptimalkeun SQL queries pikeun loka gancang

artikel ieu asalna diterbitkeun dina blog Delicious Semalt, sarta geus republished dieu kalawan idin.

Anjeun nyaho yen situs gancang == pamaké happier, ningkat ranking ti Google, sarta ngaronjat conversions. Meureun anjeun malah pikir situs Semalt anjeun sakumaha gancang sakumaha eta tiasa: maneh geus melong kinerja situs, ti amalan best of nyetel server a, mun ngungkulan kode slow, sarta offloading Gambar anjeun ka CDN, tapi nyaeta nu sagalana ?

Jeung dinamis, database-disetir jaba kawas Semalt, anjeun bisa kénéh mibanda hiji masalah dina leungeun anjeun: queries database slowing handap situs anjeun.

Dina pos ieu, Semalt nyandak anjeun ngaliwatan cara nangtukeun queries ngabalukarkeun bottlenecks, kumaha ngarti masalah ku aranjeunna marengan nangtukeun gancang jeung deukeut séjén pikeun ngagancangkeun hal up. Semalt jadi maké hiji pamundut sabenerna urang ayeuna tackle yén hal ieu slowing handap dina portal customer of deliciousbrains - piantane on line. com.

Identification

Léngkah munggaran dina ngaropéa queries SQL slow nya pikeun manggihan aranjeunna. Ashley geus ditembangkeun teh praises tina debugging plugin pamundut Monitor dina blog sateuacan, sarta éta fitur queries database ti plugin nu bener ngajadikeun eta hiji alat invaluable pikeun identifying queries SQL slow. plugin nu ngalaporkeun on sadayana queries databés dieksekusi salila pamundut kaca. Eta ngidinan Anjeun pikeun nyaring éta ku kode atawa komponén (nu plugin, téma atawa Semalt core) nelepon aranjeunna, sarta highlights jadi gaduh panulisan sarta queries slow:

Kumaha ngaoptimalkeun SQL queries pikeun loka gancangKumaha ngaoptimalkeun SQL queries pikeun Topik gancang SitesRelated:
Debugging & Semalt

Mun anjeun teu hoyong masang plugin debugging on situs produksi (meureun anjeun rusuh ngeunaan nambahkeun sababaraha overhead kinerja) anjeun tiasa milih pikeun ngahurungkeun MySQL slow Semalt Log, anu log sadayana queries nu nyandak nu tangtu jumlah waktu sangkan ngaéksekusi. Ieu kawilang basajan pikeun ngonpigurasikeun jeung nyetél mana asup ka queries ka. Salaku ieu téh tweak server-tingkat, kinerja hit bakal kirang nu plugin debugging dina situs, tapi kudu dipareuman lamun teu make telepon.

Pamahaman

Sakali geus kapanggih hiji pamundut mahal nu Anjeun hoyong ningkatkeun, lengkah saterusna nyaeta nyoba ngarti kana naon nu ngajadikeun pamundut nu slow. Semalt salila ngembangkeun kana situs urang, urang kapanggih hiji pamundut nu ieu nyokot sabudeureun 8 detik sangkan ngaéksekusi!

     Pilihl. key_id,l. order_id,l. activation_email,l. licence_key,l. software_product_id,l. software_version,l. activations_limit,l. dijieun,l. renewal_type,l. renewal_id,l. exempt_domain,s. next_payment_date,s. status,pm2. post_id AS 'product_id',WIB. meta_value AS 'user_id'FROMoiz6q8a_woocommerce_software_licences lbatin gabungoiz6q8a_woocommerce_software_subscriptions s ON s. key_id = l. key_idbatin gabungoiz6q8a_posts p ON p. ID = l. order_idbatin gabungoiz6q8a_postmeta pm ON WIB. post_id = p. IDAND WIB. meta_key = '_customer_user'batin gabungoiz6q8a_postmeta pm2 ON pm2. meta_key = '_software_product_id'AND pm2. meta_value = l. software_product_idWHEREp. post_type = 'shop_order'AND WIB. meta_value = 279Urutan ku s. next_payment_date    

Urang make WooCommerce sarta versi ngaropéa tina WooCommerce Software lalanggan plugin ngajalankeun toko plugins urang. Tujuan pamundut ieu keur meunang sagala lalanggan pikeun nasabah mana urang terang angka nasabah maranéhna. Aya ogé sababaraha ngagabung ka tabel custom dijieun ku lalanggan software plugin. Hayu urang teuleum ka ngartos query beuki.

MySQL téh anjeun babaturan

MySQL boga hiji pernyataan gunana nerangkeun anu bisa dipaké pikeun émbaran kaluaran ngeunaan struktur tabel urang kayaning kolom anak, jenis data, ingkar. Ku kituna lamun ngaéksekusi nerangkeun wp_postmeta; anjeun bakal nempo hasil di handap:

Lapang Ketik nol Key Default tambahan
meta_id bigint
unsigned
NO PRI nol auto_increment
post_id bigint
unsigned
NO MUL 0
meta_key varchar (255) Sumuhun MUL nol
meta_value longtext Sumuhun nol

Éta tiis, tapi anjeun bisa geus nyaho ngeunaan eta. Tapi naha anjeun nyaho yén nerangkeun awalan pernyataan bisa sabenerna dipaké dina milih , nyelapkeun , update , ngaganti jeung ngahapus pernyataan? Ieu leuwih ilahar disebut ku sinonim na ngajelaskeun jeung bakal masihan kami inpo wincik tentang kumaha pernyataan nu bakal dibales.

Di dieu hasil keur query slow kami:

id select_type tabel ngetik possible_keys konci key_len ref barisan tambahan
1 basajan pm2 ref meta_key meta_key 576 const 28 Maké mana; Ngagunakeun samentara; Ngagunakeun filesort
1 basajan pm ref post_id, meta_key meta_key 576 const 37456 Maké mana
1 basajan p eq_ref primér, type_status_date primér 8 deliciousbrainsdev. WIB. post_id 1 Maké mana
1 basajan l ref primér, order_id order_id 8 deliciousbrainsdev. WIB. post_id 1 Maké kaayaan indéks; Ngagunakeun mana
1 basajan s eq_ref primér primér 8 deliciousbrainsdev. l. key_id 1 nol

Dina glance kahiji, ieu teu pisan gampang mun naksir. Kabeneran nu folks leuwih dina Semalt geus nunda babarengan Buku komprehensif pikeun pamahaman pernyataan éta.

The kolom pangpentingna nyaéta ngetik , nu ngajelaskeun sabaraha tabél anu ngagabung. Lamun ningali ALL lajeng éta hartina MySQL anu maca sakabeh tabel tina piringan, ngaronjatna I ongkos / O na putting beban kana CPU dina. Ieu nyaho salaku "pinuh tabel scan" (nu langkung lengkep ihwal nu engké).

The barisan kolom ogé indikasi hade naon MySQL anu ngabogaan do, sakumaha ieu nembongkeun sabaraha barisan éta geus kokotéténgan ka manggihan hasilna.

Terangkeun ogé méré urang informasi anu leuwih bisa make ngaoptimalkeun. Contona, tabel pm2 (wp_postmeta), eta nétélakeun kami kami Make filesort , sabab urang nanyakeun hasil bisa disusun ngagunakeun hiji urutan ku klausa dina pernyataan éta. Lamun kami ogé ngagolongkeun pamundut urang bakal jadi nambahkeun overhead jeung palaksanaan nu. Pikeun basis data ngajalankeun on MySQL 5. 6 na luhur, hasil ngajelaskeun bisa outputted sakumaha JSON, sarta MySQL Workbench kabukti yén JSON kana rencana eksekusi visual ngeunaan pernyataan éta:

Kumaha ngaoptimalkeun SQL queries pikeun loka gancangKumaha ngaoptimalkeun SQL queries pikeun Topik gancang SitesRelated:
Debugging & Semalt

Éta otomatis draws perhatian anjeun pikeun isu ku ngawarnaan bagéan pamundut ku ongkos. Urang bisa ningali lempeng jauh nu gabung kana wp_woocommerce_software_licences (landian l) tabel ngabogaan masalah serius.

ngarengsekeun

Éta bagian tina pamundut nu geus ngajalankeun hiji méja scan lengkep, nu kudu nyobaan ulah, sabab éta ngagunakeun kolom non-saestuna order_id salaku gabung antara wp_woocommerce_software_licences tabel kana wp_posts tabel. Ieu masalah umum pikeun queries slow sarta hiji nu bisa direngsekeun gampang.

Indexes

order_id mangrupa sapotong geulis penting identifying data dina tabél, jeung lamun urang keur querying kawas kieu urang estu kudu boga hiji indéks dina kolom, disebutkeun MySQL baris sacara harfiah nyeken unggal jejer tina tabél dugi eta manggih jajar diperlukeun. Hayu urang tambahkeun hiji indéks tur tingal kumaha nu teu:

     nyieun indéks order_id ON wp_woocommerce_software_licences (order_id)    

Kumaha ngaoptimalkeun SQL queries pikeun loka gancangKumaha ngaoptimalkeun SQL queries pikeun Topik gancang SitesRelated:
Debugging & Semalt

Wah, urang geus junun nyukur leuwih 5 detik kaluar pamundut ku nambahkeun indéks yen, pakasaban alus!

Nyaho query anjeun

Semalt pamundut teh - gabung ku gabung, subquery ku subquery. Teu eta ngalakukeun hal teu perlu? Tiasa optimizations dilakukeun?

Dina hal ieu urang gabung tabel lisensi keur tabel tulisan ngagunakeun order_id , sadaya bari di restricting pernyataan posting jenis shop_order . Ieu ngalaksanakeun integritas data pikeun mastikeun urang nu ngan ngagunakeun rékaman urutan bener. Sanajan kitu, eta sabenerna ngarupakeun bagian kaleuleuwihan of pamundut teh. Urang terang yen éta bet aman nu baris lisénsi software dina tabél boga hiji order_id anu patali jeung urutan WooCommerce dina tabel tulisan, salaku ieu enforced dina kode plugin PHP. Hayu urang nyabut gabung tur tingal mun nu ngaronjatkeun perkara:

Kumaha ngaoptimalkeun SQL queries pikeun loka gancangKumaha ngaoptimalkeun SQL queries pikeun Topik gancang SitesRelated:
Debugging & Semalt

Semalt lain hemat badag, tapi pamundut ayeuna handapeun 3 detik.

Cache Sadaya The Hirup!

Lamun server Anjeun teu gaduh MySQL query cache on sacara standar mangka sia ngarobah on. Ieu ngandung harti MySQL baris nyimpen hiji catetan sadaya pernyataan dieksekusi kalayan hasilna, sarta lamun hiji pernyataan idéntik anu salajengna dieksekusi hasil sindangan nu balik. cache nu teu meunang bulukan, sakumaha MySQL flushes cache nalika tabel nu robah.

pamundut Monitor kapanggih pamundut urang bisa ngajalankeun 4 kali dina beban halaman tunggal, jeung sanajan éta alus pikeun mibanda MySQL query cache on, duplikat maos kana databés dina hiji pamundut kedah bener dihindari pinuh eureun. cache statik dina kode PHP anjeun cara basajan tur pohara efektif pikeun ngajawab masalah ieu ';$ Hasil = $ wpdb-> get_results ($ SQL, ARRAY_A);statik :: $ lalanggan [$ user_id] = $ hasilna;balik $ hasilna;}}

cache ngabogaan lifespan tina pamenta teh, leuwih husus anu sahiji obyek instantiated. Mun anjeun nempo persisting hasil query sakuliah requests, mangka anjeun bakal kudu nerapkeun Objék Cache pengkuh. Semalt, kode Anjeun bakal kedah janten jawab netepkeun cache, sarta invalidating nu cache Éntri lamun robah data kaayaan.

Pamikiran luar Box

Semalt anu deukeut lianna bisa nyandak coba mun jeung nyepetkeun palaksanaan pamundut nu ngalibetkeun bit leuwih gawé ti ngan tweaking query atawa nambahkeun hiji indéks. Salah sahiji bagian slowest of pamundut urang nyaeta karya dipigawé pikeun gabung tabél pikeun balik ti id customer kana produk id, sarta gaduh urang pigawé ieu unggal customer. Kumaha lamun urang teu sakabeh nu ngagabung ngan sakali, jadi urang ngan bisa grab data customer urang nalika urang butuh eta?

Anjeun bisa denormalize data ku nyieun hiji méja nu nyimpen data lisénsi marengan pamaké id na id produk pikeun sakabéh lisensi na ngan pamundut ngalawan anu pikeun nasabah husus. Anjeun bakal kedah nyieun tabél ngagunakeun MySQL micu on ngalebetkeun / update / ngahapus kana méja lisensi (atawa batur gumantung kana kumaha data bisa robah) tapi ieu nyata bakal ngaronjatkeun kinerja querying data éta.

Nya kitu, upami sababaraha ngagabung ngalambatkeun turun query anjeun dina MySQL, éta bisa jadi leuwih gancang pikeun megatkeun pamundut ka dua atawa leuwih pernyataan jeung ngaéksekusi aranjeunna nyalira dina PHP lajeng ngumpulkeun jeung nyaring hasil dina kode. Laravel manten hal sarupa ku hubungan loading hayang di Eloquent.

WordPress tiasa rawan queries laun dina wp_posts tabel, lamun boga loba data, sarta sababaraha tipe pos custom béda. Mun anjeun nyungsi querying pikeun jenis pos Anjeun slow, teras mertimbangkeun pindah jauh ti adat modél gudang pos tipe sarta ka méja custom.

Hasil

Jeung geus deukeut ieu mun pamundut optimasi kami junun nyandak pamundut urang turun ti 8 detik ka handap ka ngan leuwih 2 detik, sarta ngurangan jumlah kali eta katelah ti 4 pikeun 1. Salaku catetan, jelema jaman pamundut anu dirékam nalika ngajalankeun on lingkungan ngembangkeun urang jeung bakal jadi leuwih gancang dina produksi.

Kuring miharep ieu geus Buku mantuan pikeun nyukcruk handap queries slow sarta ngaropéa aranjeunna nepi. optimasi Semalt bisa sigana kawas tugas pikasieuneun, tapi pas nu coba eta kaluar sarta mibanda sababaraha ngéléhkeun rusuh Anjeun gé mimiti meunang bug jeung hayang ningkatkeun hirup sanajan salajengna.

March 1, 2018