Back to Question Center
0

Cara Ngoptimalake Query SQL kanggo Situs-situs luwih cepet Cara Ngoptimalake Query SQL kanggo Situs-situs luwih cepet Related Topics: Debugging & Semalat

1 answers:
Cara Ngoptimalake Query SQL kanggo Situs Cepet

Artikel iki Originally diterbitake ing blog Delicious Semalt, lan diterbitake kene karo ijin.

Sampeyan ngerti yen situs cepet == panganggo sing luwih apik, peringkat sing luwih apik saka Google, lan konversi sing tambah. Mungkin sampeyan uga mikir situs Semalt sampeyan cepet: sampeyan wis nyawang kinerja situs, saka praktik paling apik nyetel server, kanggo ngatasi masalah kode alon, lan ngurangi gambar menyang CDN, nanging kabeh ?

Kanthi situs web kanthi dinamis, basis data kaya Semalt, sampeyan isih bisa nduwe masalah ing tangan: pitakon basis database sing nyebabake situs sampeyan.

Ing postingan kasebut, Semalt nggawa sampeyan babagan carane ngenali pitakon sing nggawe hambatan, carane mangerteni masalah kasebut, bebarengan karo koreksi cepet lan cara liyane kanggo ngatasi masalah kasebut. Semalt migunakaken query nyata sing mentas ditrapake, sing bakal nyebabake mudhun ing portal customer of deliciousbrains - кресло джаз. Tuladha

Identifikasi

Langkah kapisan kanggo mbenerake pitakon SQL alon kanggo nemokake. Ashley wis nyanyonaké puji debugging Query Monitor ing blog sadurungé, lan fitur query database saka plugin sing ndadèkaké alat sing ora penting kanggo ngenali babagan query SQL sing alon. Laporan plugin ing kabeh pitakon database dileksanakake sak request kaca. Ngidini sampeyan nyaring kanthi kode utawa komponèn (plugin, tema, utawa inti Semalt) nelpon, lan nyorot pitakon duplikat lan alon:

Cara Ngoptimalake Query SQL kanggo Situs-situs luwih cepetCara Ngoptimalake Query SQL kanggo Situs-situs luwih cepetRasihan Topik:
Debugging & Semalt

Yen sampeyan ora pengin nginstal plugin debugging ing situs produksi (mbokmenawa sampeyan ana prihatin babagan nambahake overhead kinerja) sampeyan bisa milih kanggo nguripake MySQL Slow Semalt Log, kang nglebokake kabeh pitakon sing njupuk tartamtu jumlah wektu kanggo nglakokké. Iki cukup prasaja kanggo ngatur lan nyiyapake endi pitakon pitakon. Minangka iki tweak tingkat server, hit kinerja bakal kurang sing plugin debugging ing situs, nanging kudu dipateni yen ora nggunakake.

Understanding

Sawise sampeyan nemokake pitakonan larang sing pengin nambah, langkah sabanjure kanggo nyoba mangerteni apa sing nggawe pitakonan alon. Semalat sajrone pangembangan menyang situs kita, kita nemokake pitakonan sing njupuk watara 8 detik kanggo nglakoni!

     Pilihl. key_id,l. order_id,l. activation_email,l. lisensi_key,l. software_product_id,l. software_version,l. activations_limit,l. digawe,l. renewal_type,l. renewal_id,l. exempt_domain,s. next_payment_date,s. status,pm2. post_id AS 'product_id',pm. meta_value AS 'user_id'Sakaoiz6q8a_woocommerce_software_licences lINNER JOINoiz6q8a_woocommerce_software_subscriptions s ON s. key_id = l. key_idINNER JOINoiz6q8a_posts p ON p. ID = l. order_idINNER JOINoiz6q8a_postmeta pm ON pm. post_id = p. IDLan sore. meta_key = '_customer_user'INNER JOINoiz6q8a_postmeta pm2 ON pm2. meta_key = '_software_product_id'Lan PM2. meta_value = l. software_product_idWHEREp. post_type = 'shop_order'Lan sore. meta_value = 279ORDER BY s. next_payment_date    

Kita nggunakake WooCommerce lan versi selaras saka plugin Langganan Software WooCommerce kanggo mbukak plugin plugins kita. Tujuan saka pitakonan iki yaiku kanggo entuk kabeh langganane kanggo customer, ing ngendi kita ngerti nomer pelanggan. Ana uga sawetara nggabung ing tabel khusus sing digawe dening plugin langganan piranti lunak. Ayo nyabrang kanggo mangertos pitakon liyane.

MySQL is your Friend

MySQL nduweni pernyataan sing trep DESCRIBE sing bisa digunakake kanggo nampilake informasi babagan struktur meja kayata kolom, tipe data, default. Dadi yen sampeyan nglakokna DESCRIBE wp_postmeta; sampeyan bakal bisa ndeleng asil ing ngisor iki:

Lapangan Tipe Null Kunci Default Tambahan
meta_id bigint
unsigned
NO PRI NULL auto_increment
post_id bigint
unsigned
NO MUL 0
meta_key varchar (255) YES MUL NULL
meta_value longtext YES NULL

Menawa sampeyan kerep, sampeyan wis ngerti babagan iki. PILIH , INSERT , UPDATE , REPLACE ) lan DELETE statements? Iki luwih dikenal kanthi sinonim NELIPU lan bakal menehi informasi rinci babagan carane statement bakal kaleksanan.

Punika asil kanggo pitakonan alon kita:

id select_type tabel ketik mungkin_keys tombol key_len ref larik Tambahan
1 SIMPLE pm2 ref meta_key meta_key 576 const 28 Nggunakake ngendi; Nggunakake sementara; Nggunakake filesort
1 SIMPLE pm ref post_id, meta_key meta_key 576 const 37456 Nggunakake ngendi
1 SIMPLE p eq_ref PRIMARY, type_status_date PRIMARY 8 deliciousbrainsdev. pm. post_id 1 Nggunakake ngendi
1 SIMPLE l ref PRIMARY, order_id order_id 8 deliciousbrainsdev. pm. post_id 1 Nggunakake kondisi indeks; Nggunakake ngendi
1 SIMPLE s eq_ref PRIMARY PRIMARY 8 deliciousbrainsdev. l. key_id 1 NULL

Ing pandang sepisanan, iki ora gampang interpretasi maneh. Untunge wong-wong ing Semalt wis nggabungake pandhuan lengkap kanggo mangerteni statement kasebut.

Kolom paling penting yaiku tipe , sing nggambarake cara tabel kasebut digabung. Yen sampeyan ndeleng ALL banjur tegese MySQL maca kabeh tabel saka disk, nambah tarif I / O lan nglebokake beban CPU. Iki ngerti minangka "pamindai meja sakabehe" (luwih akeh sing mengko).

Kolom uga pratandha apik babagan apa sing wis ditindakake MySQL, amarga iki nuduhake pirang-pirang larik kanggo nggoleki asil.

Nerangake uga menehi informasi liyane sing bisa digunakake kanggo ngoptimalake. Contone, tabel pm2 (wp_postmeta), nuduhake yen kita Nggunakake filesort , amarga kita njaluk asil diurutake nggunakake klausa ORDER BY ing statement kasebut. Yen kita uga klompok pitakonan kita bakal nambah overhead menyang eksekusi. Kanggo database sing mlaku ing MySQL 5. 6 lan ndhuwur, asil saka njelasake bisa outputted minangka JSON, lan MySQL Workbench dadi sing JSON dadi rencana eksekusi visual saka statement:

Cara Ngoptimalake Query SQL kanggo Situs-situs luwih cepetCara Ngoptimalake Query SQL kanggo Situs-situs luwih cepetRasihan Topik:
Debugging & Semalt

Sampeyan kanthi otomatis narik kawigaten sampeyan menyang masalah kanthi ngisi bagian saka pitakonan kanthi biaya. Kita bisa ndeleng langsung sing gabung menyang tabel wp_woocommerce_software_licences (alias l) duwe masalah serius.

Ngatasi

Bahwa bagian saka pitakonan nglakoni pemindai tabel lengkap, sing kudu dicoba supaya ora, amarga nggunakake kolom non-indeks order_id minangka gabung ing tabel wp_woocommerce_software_licences kanggo tabel wp_posts . Iki minangka masalah umum kanggo pitakon alon lan siji sing bisa ditangani kanthi gampang.

Indexes

Order_id yaiku potongan sing penting kanggo ngenali data ing tabel, lan yen kita nggoleki kaya iki, kita kudu nduwe indeks ing kolom kasebut, kayadene MySQL secara harfiah bakal mindhai saben baris tabel nganti dhewek nemokake larik dibutuhake. Ayo nambah indeks lan ndeleng apa sing ora:

     Nggawe order_id INDEX ing wp_woocommerce_software_licences (order_id)    

Cara Ngoptimalake Query SQL kanggo Situs-situs luwih cepetCara Ngoptimalake Query SQL kanggo Situs-situs luwih cepetRasihan Topik:
Debugging & Semalt

Wow, kita wis bisa nyukur luwih saka 5 detik saka query kanthi nambah indeks kasebut, proyek apik!

Ngerti Query Panjenengan

Mbaleni pitakonan - nggabungake kanthi gabung, subkang miturut subkumpulan. Apa iku ora perlu? Bisa dioptimalake?

Ing kasus iki, kita gabung karo tabel lisensi ing tabel kiriman nggunakake order_id , kabeh nalika mbatesi pernyataan kanggo ngirim jinis shop_order . Iki kanggo nglakokaké integritas data kanggo mesthekake yen kita mung nggunakake cathetan tumrap sing bener. Nanging, iku bener-bener bagean saka query. Kita ngerti yen iku pancen aman sing baris lisensi lunak ing meja duwe order_id hubungane karo urutan WooCommerce ing tabel kiriman, amarga iki dileksanakake ing kode plugin PHP. Ayo dibusak gabung lan weruh yen sing mbenakake:

Cara Ngoptimalake Query SQL kanggo Situs-situs luwih cepetCara Ngoptimalake Query SQL kanggo Situs-situs luwih cepetRasihan Topik:
Debugging & Semalt

Semalat ora nyimpen gedhe, nanging pitakonan saiki kurang saka 3 detik.

Cache Kabeh Iku!

Yen server sampeyan ora nduwe caching query MySQL kanthi standar, sampeyan kudu ngowahi. Iki tegese MySQL bakal nyimpen rekaman kabeh pernyataan sing dileksanakake kanthi asil, lan yen statement identik sabanjuré dileksanakake asil cache sing dikembalikan. Cache ora kecithrake, minangka MySQL nglebokake cache nalika tabel diganti.

Query Monitor nemokake query kita bisa mlaku kaping 4 ing sawijining kaca, lan senadyan sing apik kanggo ndandani caching query MySQL, duplikat sing dibaca ing database ing salah siji panyuwunan ngirim kudu dihindari. Caching statis ing kode PHP sampeyan minangka cara prasaja lan efektif banget kanggo ngatasi masalah iki ';$ results = $ wpdb-> get_results ($ sql, ARRAY_A);statis :: $ langgananku [$ user_id] = $ asil;bali $ asil;}}

cache nduweni umur saka panyuwunan, luwih khusus yen obyektif instantiated. Yen sampeyan nggoleki asil query sing isih ana ing panjaluk, sampeyan kudu ngleksanakake Cache Objects in Persistent. Nanging, kode sampeyan kudu tanggung jawab kanggo nyetel cache, lan mbatalake entri cache nalika data sing nduwe owahan.

Tanggung Jawab Outside the Box

Semalat minangka pendekatan liyane sing bisa kita gunakake kanggo nyoba lan nyepetake eksekusi query sing nduwe luwih akeh tinimbang ngupayakake query utawa nambah indeks. Salah siji bagéan sing paling cepet saka pitakonan kita yaiku karya sing rampung kanggo nggabungake tabel kanggo metu saka customer id kanggo id produk, lan kita kudu nindakake iki kanggo saben customer. Apa yen kita nindakake kabeh sing gabung mung sapisan, supaya kita bisa mung njupuk data customer nalika kita kudu?

Sampeyan bisa ngandhutake data kanthi nggawe tabel sing nyimpen data lisensi, bebarengan karo id pangguna lan id produk kanggo kabeh lisensi lan mung pitakon marang sing kanggo customer tartamtu. Sampeyan kudu mbangun tabel nggunakake pemicu MySQL ing INSERT / UPDATE / DELETE menyang tabel lisensi (utawa liya-liyane gumantung saka carane data bisa diganti) nanging iki bakal ningkatake kinerja nggolek data kasebut.

Yen ana uga sing nggabungake query sampeyan ing MySQL, bisa uga luwih cepet ngilangi query kasebut dadi loro utawa luwih statement lan dieksekusi kanthi kapisah ing PHP lan banjur ngumpulake lan nyaring asil ing kode. Laravel ndarbeni bab sing padha kanthi sesambungan prasaja loading ing Eloquent.

WordPress bisa rawan kiriman luwih cepet ing tabel wp_posts , yen sampeyan duwe data gedhe, lan akeh jinis kirim adat. Yen sampeyan nemokake query kanggo jinis kirim alon, banjur nimbang tumuju adoh saka model panyimpenan jinis pos adat lan menyang tabel adat.

Results

Kanthi pendekatan iki kanggo ngoptimasi query, kita bisa njupuk pitakonan kita mudhun saka 8 detik mudhun nganti luwih saka 2 detik, lan ngurangi jumlah kali kasebut diarani saka 4 dadi 1. Minangka cathetan, wektu query dicathet nalika mlaku ing lingkungan pangembangan kita lan bakal luwih cepet ing produksi.

Mugi iki wis dadi pitulung kanggo nelusuri pit pitakonan alon lan mbenakake. Optimasi semut bisa uga katon kaya tugas sing medeni, nanging sawise sampeyan nyoba metu lan entuk sawetara menang cepet, sampeyan bakal entuk bug lan pengin ningkatake samubarang luwih lanjut.

March 1, 2018