Jika plugin Anda akan memiliki BANYAK data, maka menggunakan wp_postmeta
BUKAN ide yang baik seperti yang ditunjukkan di bawah ini:
Mengambil WooCommerce sebagai contoh, di toko dengan ~ 30.000 produk, akan ada rata-rata, ~ 40 pos meta (atribut dan semuanya) per produk, 5 gambar produk per produk, yang berarti akan ada ~ 4 gambar meta untuk setiap gambar:
30.000 produk x 40 meta masing-masing = 1.200.000 baris di wp_postmeta
+
30.000 produk x 5 gambar setiap x 4 meta gambar untuk masing-masing = 600.000 baris di wp_postmeta
Jadi hanya dengan 30.000 produk yang Anda cari memiliki 1.800.000 baris wp_postmeta
.
Jika Anda menambahkan lebih banyak properti ke produk Anda atau gambar produk Anda, nomor ini akan berlipat ganda.
Masalahnya ada dua:
- Bergabung sendiri sangat mahal dengan MySQL
wp_postmeta
tabel tidak diindeks kecuali Anda menggunakan versi mysql nanti (yaitu tidak ada indeks FULLTEXT untuk meta_value
)
Untuk memberikan contoh dari kasus aktual:
SELECT meta_value FROM wp_postmeta WHERE meta_key LIKE '_shipping_city'
Ini memilih kota pengiriman dari semua detail pesanan dengan kekalahan ~ 3 detik pada server khusus level entri bahkan jika ada 5-10 pesanan . Ini karena kueri dijalankan dari wp_postmeta
tabel yang memiliki ~ 3 juta baris dalam instalasi langsung.
Bahkan beranda datang cukup lambat, karena tema menarik berbagai elemen dari wp_postmeta
- slider, beberapa sisipan ulasan, beberapa meta lainnya. Secara umum daftar produk sangat lambat, pencarian juga lambat ketika mendaftarkan produk.
Anda tidak dapat memperbaikinya melalui cara normal apa pun. Anda dapat menempatkan Pencarian Elastis di server Anda dan menggunakan plugin Pencarian Elastis di Wordpress, Anda dapat menggunakan redis / memcached, Anda dapat menggunakan plugin cache halaman yang baik, tetapi pada akhirnya masalah mendasar akan tetap - mengambil sejumlah data dari kembung wp_postmeta
tabel akan lambat, setiap kali dilakukan. Di server tempat saya menguji solusi yang saya terapkan di bawah ini, semua ini diinstal dan dikonfigurasikan dengan benar dan dioptimalkan, dan situs bekerja dengan baik-baik saja untuk pengguna yang tidak masuk atau pertanyaan yang biasa dilakukan sejak plugin caching dimulai.
Tetapi saat pengguna yang masuk mencoba melakukan sesuatu yang tidak biasa dilakukan atau crons, caching plugins, atau utilitas lain ingin mengambil data aktual dari db untuk menyimpannya atau melakukan hal lain, semuanya berjalan lambat.
Jadi saya mencoba sesuatu yang lain:
Saya memberi kode plugin kecil untuk mengambil semua meta produk (postmeta untuk produk tipe posting ) ke tabel kustom yang dihasilkan oleh kode. Plugin ini mengambil semua meta untuk setiap posting dan membuat tabel dengan menambahkan setiap meta sebagai kolom dan memasukkan nilai ke dalam setiap baris. Saya mengubah format EAV menjadi format relasional mendatar dan datar. Saya juga punya plugin untuk menghapus postmeta dari semua produk yang dipindahkan dari wp_postmeta
tabel.
Sementara saya melakukannya, saya memindahkan postmeta lampiran dan semua meta tipe posting lainnya ke tabel mereka sendiri.
Lalu saya terhubung ke get_(post_type)_meta
filter untuk mengganti pengambilan metadata untuk melayani mereka dari tabel kustom baru.
Sekarang permintaan yang sama dari sebelumnya, yang mengambil ~ 3 detik untuk mengambil dari wp_postmeta
mengambil ~ 0,006 detik. Situs sekarang berperilaku seolah-olah itu adalah instalasi WP baru.
....................
Tentu, melakukan hal-hal dengan cara Wordpress lebih baik. Ini sebenarnya norma.
Namun , juga pengetahuan yang jelas bahwa tabel EAV sangat tidak efisien dalam penskalaan. Ini sangat fleksibel dan memungkinkan Anda menyimpan data apa pun, tetapi harga yang Anda bayar untuk itu, adalah kinerja. Ini merupakan trade off yang mendasar.
Dalam konteks itu, sulit untuk memberitahu seseorang yang berniat untuk memiliki banyak data dan - tuhan melarang - permintaan / pencarian data itu untuk menggunakan wp_postmeta
tabel pasti. Performa hit akan sangat bagus.
Menggunakan tabel khusus Anda akan memungkinkan data Anda menumpuk dan masih cukup cepat.
Seperti halnya Pippin Williams, pembuat plugin Easy Digital Downloads menyebutkan bahwa dia akan menggunakan tabel khusus jika dia baru memulai pengkodean pluginnya, jika Anda akan membuat sesuatu yang akan digunakan untuk waktu yang lama atau menumpuk banyak data, lebih efisien menggunakan tabel khusus jika Anda mendesainnya dengan baik.
Anda harus memastikan bahwa pengembang plugin / addon lain memiliki cara untuk menghubungkan ke plugin Anda untuk memanipulasi data Anda sebelum dan sesudah pengambilan data. Jika Anda melakukannya, maka Anda cukup solid.