Blog

5 cách để tối ưu câu truy vấn SQL của bạn

Tối ưu câu truy vấn SQL: Là một lập trình viên, chắc chắn bạn sẽ phải làm việc với Database. Mặc dù các framework ORM (Object Relation Mapping) hiện nay cung cấp rất nhiều hàm thực hiện việc thao tác với DB. Tuy nhiên không phải lúc nào nó cũng được tối ưu. Và điều đó vẫn phụ thuộc vào chính cách sử dụng của bạn nữa.

Bài hôm nay của mình sẽ cho bạn 5 cách để tối ưu câu truy vấn, giúp cải thiện performace, nâng cao hiệu quả của ứng dụng

1. Học cách đánh Index hợp lý

Học cách làm sao để đánh index cho hợp lý là các tốt nhất là để 5 cách để tối ưu câu truy vấn SQL của bạn. Index cho phép truy cập một cách nhanh hơn tới DB trong những trường hợp điển hình. Những người mới làm việc với DB thường cảm thấy việc đánh index này cao siêu hoặc rất khó. Họ hoặc là chẳng đánh index cho bất cứ cái gì, hoặc là cố gắng để đánh index cho mọi thứ.

Tối ưu câu truy vấn SQL

Dĩ nhiên, không có phương án nào trong đó là đúng cả. Với việc không đánh index cho bất cứ thứ gì, câu truy vấn của bạn sẽ có khả năng bị chậm. Còn nếu đánh index cho tất cả mọi thứ, việc update hay insert sẽ bị chậm lại.

Nếu bạn không chắc chắn rằng mình đủ hiểu về index, hãy tìm hiểu nhiều hơn về nó. Chú trọng vào việc cân nhắc xem trường nào nên đánh index, trường nào không, và đánh index theo kiểu nào, B-tree hay BitMap .v.v.v

2. Chỉ lấy ra những dữ liệu cần thiết

Với tối ưu câu truy vấn SQL – Một trong những sai lầm mà mình thấy nhiều bạn mới hay gặp phải, đó là lúc nào cũng sử dụng SELECT * cho dù các rất nhiều trường (cột) các bạn không cần thông tin của chúng.

Nếu bảng nhỏ, việc lấy thêm các trường này không gây ra quá nhiều khác biệt. Nhưng với tập dữ liệu lớn hơn, việc chỉ định những cột mà bạn muốn lấy sẽ giảm rất nhiều thời gian truy vấn.

Vì thế, ví dụ nếu bạn chỉ cần lấy những thông tin: tên, ngày sinh, giới tính của các USER, thay vì sử dụng

SELECT * FROM USER ...

thì hãy sử dụng

SELECT NAME, DATE_OF_BIRTH, GENDER FROM USER ...

để câu truy vấn của mình có tốt độ lý tưởng hơn nhé

Cũng tương tự như thế, nếu bạn chỉ cần một số lượng giới hạn các record trả về, thì hãy sử dụng LIMIT (hay tương tự thế ở các DB khác).

SELECT * FROM USER;

Ví dụ, nếu bạn chỉ cần hiển thị 10 record đầu tiên trong 50.000 record của bảng USER, thì câu truy vấn này sẽ báo với DB của bạn để hạn chế lượng dữ liệu cần tìm hiểu. Bằng cách này, DB sẽ dừng lại việc tìm kiếm sau khi đã tìm được 10 record thay vì sẽ phải scan toàn bộ bảng USER

SELECT * FROM USER LIMIT 10;

3. Tránh sử dụng function bên trong toán tử so sánh

Để tối ưu câu truy vấn SQL thì Function là một cách thuận tiện để xử lý các task phúc tạp mà bạn có thể sử dụng nó cả ở mệnh đề SELECT hay WHERE. Tuy nhiên, ứng dụng chúng trong mệnh đề WHERE có thể gây ra những vấn đề ko tốt về performance. Hãy xem qua ví dụ dưới đây

SELECT nickname FROM users WHERE DATEDIFF(MONTH, appointment_date, '2015-04-28') < 0;

Thậm chí nếu bạn đã đánh index cho cột appointment_date trong bảng users, câu truy vấn vẫn phải scan toàn bộ bảng. Đó là bởi vì bạn sử dụng hàm DATEDIFF cho cột mà bạn đang xét (appointment_date).

Giá trị tính toán được của hàm này sẽ được tính lúc runtime, như vậy nó sẽ phải kiểm tra từng record trong bảng, lấy ra giá trị output và đem so sánh với 0. Để cải thiện performace, chúng ta có thể đổi câu truy vấn như sau

SELECT nickname FROM users WHERE appointment_date > '2015-04-30';

Dĩ nhiên trong nhiều trường hợp, ta ko thể có được 1 câu truy vấn tương tự như vậy, như nếu có thể, hãy biến câu truy vấn ban đầu mà ở đó, ta đang sử dụng hàm đối với cột (được đánh index) của bảng trở thành 1 câu truy vấn tối ưu hơn như ví dụ bên trên.

4. Cân nhắc việc loại bỏ các câu truy vấn con tương quan

Câu truy vấn con tương quan là những câu truy vấn con phục thuộc vào câu truy vấn ngoài. Nó sử dụng dữ liệu lấy được từ câu truy vấn ngoài trong mệnh đề WHERE. Ví dụ bạn muốn lấy danh sách tất cả những user mà đã ủng hộ. Bạn có thể sử dụng câu truy vấn

SELECT user_id, last_name FROM users 
    WHERE EXISTS (SELECT * FROM donationuser WHERE donationuser.user_id = users.user_id);

Trong trường hợp này, câu truy vấn con sẽ chạy 1 lần với mỗi record của câu truy vấn chính. Cụ thể là mỗi lần xét tới 1 record của câu truy vấn chính, câu truy vấn con lại được chạy với điều kiện WHERE trong đó là giá trị user_id của record đang đc xét của câu truy vấn chính. Do đó nó câu truy vấn chưa hiệu quả

Thay vào đó, ta có thể sử dụng

SELECT DISTINCT users.user_id FROM users 
    INNER JOIN donationuser ON users.user_id = donationuser.user_id;

Nếu có hàng triệu user trong DB, câu lệnh với câu truy vấn con tương quan sẽ hầu như có thể gây kém hiệu quả hơn sử dụng INNER JOIN bởi vì ta cần chạy câu truy vấn con hàng triệu lần. Nhưng nếu bạn đang tìm kiếm những người donations được tạo bởi 1 user chỉ định, thì sử dụng nó lại là 1 ý tưởng không tồi.

Theo quy tắc chung, nếu bạn tìm kiếm nhiều hoặc hầu hết các hàng, hãy cố gắng tránh sử dụng các truy vấn con tương quan. Tuy nhiên, hãy nhớ rằng việc sử dụng các truy vấn con tương quan có thể là không thể tránh khỏi trong một số trường hợp.

5. Tránh sử dụng ký tự %, _ ở đầu giá trị tìm kiếm LIKE

Bất cứ khi nào có thể, tránh sử dụng LIKE theo cách này

SELECT * FROM users WHERE name LIKE '%bar%';

Sử dụng % ở đầu sẽ ngăn việc DB sử dụng index (nếu có) của cột name. Do đó sẽ làm giảm tốc độ truy vấn. Vì thế, nếu có thể (spec cho phép), hãy tránh

SELECT * FROM users WHERE name LIKE 'bar%';

Bài viết của mình được dịch từ nguồn http://www.vertabelo.com/blog/technical-articles/5-tips-to-optimize-your-sql-queries

Chúng tôi chuyên cung cấp những khóa học về tối ưu câu lệnh (SQL level 2), Xây dựng kho dữ liệu (Data Warehouse)

Đăng ký ngay để nhận được tư vấn chi tiết lộ trình dành riêng cho bạn nhé!

Leave a Reply

Your email address will not be published. Required fields are marked *

suarairama pestanada beritabandar rumahjurnal podiumnews dailyinfo wikiberita zonamusiktop musicpromote bengkelpintar liburanyuk jelajahhijau carimobilindonesia jalanjalan-indonesia otomotifmotorindo ngobrol olahraga mabar dapurkuliner radarbandung indosiar radarjawa medianews infowarkop kalbarnews ketapangnews beritabumi kabarsantai outfit faktagosip beritagram lagupopuler seputardigital updatecepat marihidupsehat baliutama hotviralnews cctvjalanan beritajalan beritapembangunan pontianaknews monitorberita koronovirus museros iklanjualbeli festajunina capoeiravadiacao georgegordonfirstnation 1reservoir revisednews

Teknik Presisi Mengatur Kecepatan Spin Mahjong Ways 3 Untuk Kenaikan Hasil yang Ideal Mulai dengan Doa Menang Cara Efektif Menganalisis Trik Baccarat Online Secara Sistematis Cara Unlock Pola Tersembunyi Mahjong Wins 3 Sebagai Langkah Pintar Meraih Kemenangan Trik Escape di Putaran Cepat Pragmatic Gate Olympus Sambut Kemenangan Spesial Pelajari Membaca Pola Sederhana Mahjong Ways 2 Bikin Menang Tipis Tapi Tetap Stabil Taktik Rahasia Supir Pribadi Memanggil Scatter Hitam di Mahjong Ways 2 Saat Drive Thru Cara Intuisi Bekerja Mencatat Pola Baccarat Online Melalui Skema yang Sempurna Tafsir Personal Membuka Pintu Berkah Lewat Mahjong Wins 3 Bikin Keuntungan Tetap Stabil Arsip Data Narasi Gates of Olympus Ciptakan Putaran Warna Spesial Lebih Menguntungan Resonansi Sunyi di Tengah Irama Mahjong Ways 3 Berikan Labirin Menuju Cuan Besar Perhitungan Panas dan Dingin Alur Spin Wild Bandito untuk Mengincar Target yang Realistis Rahasia Kemenangan 99% dengan Pola Top Scatter di Mahjong Ways 3 Bikin Heboh Dunia Maya Metode Baru Kelola Emosi Bermain Baccarat Online dengan Cermat Melalui Perhitungan yang Tepat Seni Mengatur Ritme Mahjong Wins 3 Layak Menjadi Pondasi Kuat Menjaga Keuntungan yang Seimbang Langkah Tepat Menghadapi Sulitnya Kemunculan Scatter di Gates of Olympus dengan Strategy yang Kondusif Semarang Menjadi Kota Fantasi Mahjong, Tukang Edit Foto Mengunggah Permainan Pola Mahjong Terbaru Hujan Deras, Sejumlah Pengendara Menepi dan Mencoba Bermain Mahjong Wins 3 yang Sedang Bocor Saat Ini Fenomena Tengah Malam, Mahjong Ways 3 Tiba-Tiba Berubah Warna dan Disebut Masuk Mode Rahasia Scatter Black Peneliti Visual SUHUBET Ungkap Sinkronisasi Pola Mahjong dan Musik, Disebut Harmoni Terserasi Tahun Ini Kobarkan Semangat Syair Mahjong, Tangerang Gelarkan Protokol Putaran Cepat 50 Kali Dalam 1 Kali Coba Rahasia di Balik Pola Mahjong Wins 3 Akhirnya Ditemukan! Pemain Asal Bandung Bongkar Trik yang Selama Ini Disembunyikan Strategi Langkah Mundur di Mahjong Ways Tiba-Tiba Populer, Katanya Bisa Bikin Pola RTP Tetap Stabil Sepanjang Hari Dari Analisis Panjang ke Hasil Mengejutkan! Mahjong Wins 3 Ternyata Punya Pola Tersembunyi yang Jarang Disadari Pemain Rahasia Pemain Surabaya Akhirnya Terkuak! Mahjong Ways 2 Bisa Pecah Berkali-Kali Cuma Modal Rotasi 15 Menit Sekali Fenomena Baru Mahjong Wins! Pemain Bogor Ungkap Pola Pergantian Hari yang Selalu Bawa Kemenangan Besar Fenomena Langka di Komunitas Digital Mahjong Black Dragon, Visualnya Bikin Kagum Perpaduan Suara dan Penyajian Semerbak untuk Mata Kita, Mahjong Sedang Melakukan Pembangunan Besar Besaran Beginilah Caranya Agar Perputaran Selalu Stabil dan Membuat Mahjong Seru untuk Diperjuangkan Perbincangan yang Memberikan Esensi Kehidupan Mahjong dengan Datangnya Pola Wild Anti Kalah Host Livestreaming Sedang Menjadi Perbincangan, Dikarenakan Bermain Mahjong dengan Pecahan Besar Diketahui Bermain di SUHUBET Menggunakan Mahjong Ways 2, Pemuda Hilman Mendapatkan 29 Juta Membagikan Cara Membuat Kandang Ayam Ternak Hanya Menggunakan Lucky Neko Saja, Joko Mendapatkan 410.000.000 dan Membagikan Pengalaman dan Cara Merawat Burung Beo Pola Terbaru Hari Ini dari Anggi Analisis Data Permainan Mahjong Ways 2 Selama 3 Bulan Tim Analisis Data Indonesia Telah Bermain Memecahkan Kode Mahjong Wins 3, Perjuangan 2 Bulan Akhirnya Terbayarkan dengan 320 Juta Kantor Suhubet Telah Merilis RTP Terbaru Mahjong Wins 3 99%, Hasil dari Data Analisis Para Pemain Baru Penjual Tahu Bulat Dadakan Dikagetkan Sama Pecahnya Wild Mahjong Wins 3 Dengan Membawakan 450 Juta Pemain Pro Dari Kota Madiun Berbagi Taktik Permainan Mahjong Wins 3 Yang Menghasilkan Berbagai Kemenangan Terbukti Ampuh, Suherman Menggunakan Pola Terlarang Permainan Mahjong Ways 3 Dengan Hasil 320.000.000 Rahasia Terbaru Pola Mahjong Ways 3 Terbongkar RTP98% Membawakan Wild Sebesar 410.000.000 Suli Dari Pemantang Siantar Membawakan Pola Terbaru Hasil Analisa Terbaru Mahjong Wins 3 Dengan Cara High Risk High Return Perpaduan Simbol Wild dan Scatter yang Menggemparkan Mahjong Ways 3, Bentuk Apresiasi Para Pemain Setiap SUHUBET Putaran 3 Manual dan 20 Auto Membuahkan Hasil, Pemain Bernama Kintami di Mahjong Ways 3 Ciptakan Momen yang Sangat Keren Pola Terbaru Diberi Nama ‘Harmony Data’ karena Ditemukan dari 1.200 Putaran Analisis oleh Komunitas SUHUBET Pola Unik Anak Bengkel Ini Bikin Komunitas Mahjong Ways 3 Terkejut, Disebut Punya Akurasi Tinggi Gelombang Wild Tak Biasa, Scatter Muncul Bersamaan Seperti Dipanggil oleh Pola Data Baru di Mahjong Ways 3 Taktik Licik Digunakan oleh Maskapai Mahjong dengan Memberikan Diskon Perputaran dan Paket Jalan Wild Sebesar Rp 312 Juta Inspiration Bermain Catch The Wild Symbol Mengundang Banyak Pemain Mencoba di Mahjong Ways 3 Karena Membagikan Sejumlah Kemenangan Menarik Pola Terbaru Menjamin Cuan Hanya Bermodal Receh 50 Ribu Sudah Bisa Meraup Untung Rp 21 Juta di SUHUBET Strategi Ganas dan Terlarang Digunakan Pelajar SMK dalam Bertarung Melawan Mahjong Wins 3 dengan Pencapaian Rp 152 Juta Ini yang Dinamakan Berkat, Supir Angkot Membeli Motor Vario 160 dengan Penghasilan dari Mahjong Wins 3, Simak Pola Terbaru dari Supir Angkot Pemanfaatan Strategi dan Fitur Simbol Wild Mahjong Ways 1 Menghadirkan Pengalaman Mengejar Api Kemenangan di Dunia Digital Ini Programing Asal Jepara Membuat Fusion Dari Wild Mahjong Wins Menghadirkan Pengalaman Membaca Pola RTP Terbaru Koi Gates Memberikan Rp 25.000.000, Triyono Memberikan Pengalaman Memelihara dan Cara Merawat Ikan Koi Supir Kontainer Mendapatkan Rp 75.000.000 di Mahjong Ways 3 Pada Saat Ia Sedang Beristirahat di Rest Area Tukang Bangunan Asal Jawa Tengah Membuat Rumah Baru Untuk Dirinya Dengan Bermodalkan Rp 450.000.000 Hasil Dari Mahjong Ways 3 Yang Ia Mainkan Pahami Dan Cobain Takti Terbaru Kakek Zeus Yang Dipastikan Mendapatkan Hadiah GrandPrize 650.000.000 Kakek Asal Goa Jomblang Memberikan Bansos RTP Mahjong Ways 2 Dengan Aturan Take Profit Rp 152.000.000 Tukang Servis HP Membongkar HP Seorang Senior Mahjong Wins 3 Dan Mendapatkan Pola Bermain 20 30 10 50 Yang Selalu Membuat Cuan Jangan Terengah Takti Yang Telah Dibuktikan Anti Boncor di Kakek Zeus Menggunakan Pola 40 50 20 Berhasil Membuat Tukang Cilok Keliling Membeli Motor Baru Jangan Terengah Takti Yang Telah Dibuktikan Anti Boncor di Kakek Zeus Menggunakan Pola 40 50 20 Berhasil Membuat Tukang Cilok Keliling Membeli Motor Baru Cara Cerdas Menggunakan Simbol Wild dari Analisis Data Mahjong Ways 2 Mendapatkan 10 Juta Jangan Terengah Takti Yang Telah Dibuktikan Anti Boncor di Kakek Zeus Menggunakan Pola 40 50 20 Berhasil Membuat Tukang Cilok Keliling Membeli Motor Baru Mahjong Analisa Pola Terbaru dan Dikatakan Pola Terlarang dari Bandar Karena Menghasilkan 125 Juta untuk Pemain Baru Stick Biliar Baru yang Dibawa Pemain Pro Ternyata Dibeli Menggunakan Hasil Mahjong Wins 3 yang Ia Menangkan Sebesar 260 Juta Tak Hanya Menyediakan Pemancingan Ikan Galatama di Jember Juga Menyediakan Turnamen Mancing Simbol Wild dengan Hasil Spektakuler Tak Diduga Samberan Petir di HP Pelajar SMA Ternyata Berasal dari Kakek Zeus dengan Pengali X500 Turun pada Saat yang Sama Memberikan Maxwin 120 Juta Gempa Papua 6,7 SR Bikin Panik, Komunitas SUHUBET dan Mahjong Ways 1 Sebut Getarannya Mirip Pola Scatter Cepat Indonesia Beli 42 Jet Tempur, Publik di SUHUBET Bandingkan Strateginya dengan Pola Panas Mahjong Wins 3 Kasus Warga Australia di Bali, Warganet di SUHUBET Mahjong Wins 2 Samakan Dramatiknya dengan Plot Permainan Digital Program Makanan Gratis Sekolah Tersendat, Netizen di Mahjong Ways 2 SUHUBET Sebut Polanya Mirip Ritme Naik-Turun Scatter Uji Bahan Bakar Ramah Lingkungan Dimulai, Forum Mahjong Ways 3 di SUHUBET Ramai Bahas Konsistensi Polanya Energi Bersih dan Pola Alamiah Mahjong Ways 2 Jadi Perbincangan di SUHUBET Ilmuwan Dinyatakan Bebas, Komunitas SUHUBET Kaitkan dengan Pola Rebound Mahjong Wins 3 Indonesia Beli 42 Jet Tempur, Netizen SUHUBET Sebut Mirip Strategi Mahjong Wins 2 Patrick Kluivert Dipecat, Netizen SUHUBET Bandingkan dengan Pola Keberuntungan Mahjong Ways 1 SUHUBET Bahas Program Digital Ekonomi dan Pola Mahjong Ways 3 yang Sedang Naik Daun Cerita Tukang Bakso yang Mendadak Viral Usai Dapat Kejutan Tak Terduga Saat Hujan Deras Data Baru Tunjukkan Pola Perputaran Ekonomi Mirip Strategi Anak Muda di Mahjong Wins 2 Fenomena Aneh di Pontianak Warga Kaitkan dengan Pola Cepat yang Viral di Medsos Gempa Kecil Guncang Papua Komunitas SUHUBET Bandingkan Getarannya dengan Pola Scatter Mahasiswa Ini Temukan Rumus Pola Keberuntungan Netizen Sebut Mirip Mahjong Ways 3 Bocah SD di Singkawang Jadi Sorotan Pola Mainnya Disebut Seakurat Profesional Dosen Ekonomi Buka Suara Soal Fenomena Pola Cuan Disebut Menular ke Dunia Digital Pakar Feng Shui Bongkar Rahasia Perputaran Keberuntungan Netizen Mirip Pola Scatter Hitam Tren Pola Cepat di Media Sosial Bikin Heboh Netizen Kaitkan dengan Mahjong Wins 3 Warkop Kecil di Surabaya Ramai Didatangi Setelah Video Pola Unik Viral di TikTok Bocoran Pola Rahasia dari Komunitas SUHUBET Disebut Punya Akurasi Lebih dari 90% Fenomena Anak Gen-Z Takut Ketinggalan Pola Disebut Sebagai Era Baru Cuan Cepat Hasil Analisis Digital Pola Cepat Viral di SUHUBET Disebut Bisa Picu Efek Domino Netizen Ramai Bahas Pola Simbol Keberuntungan Ternyata Terinspirasi dari Mahjong Ways Seorang Supir Travel Mendadak Viral Usai Menemukan Pola Aneh Saat Istirahat di Jalan Tol Cerita Pemuda Asal Bandung Viral Setelah Temukan Pola Kehidupan dari Game Digital Populer Dosen Ekonomi Sebut Pola Digital Mirip Mekanisme Pasar, Netizen Langsung Bahas Hebatnya Logika Itu Fenomena Komunitas Digital Bahas Pola Analisis Unik, Disebut Bikin Hidup Lebih Teratur Komunitas SUHUBET Disebut Punya Akurasi Analisis Lebih dari 90%, Banyak yang Tak Percaya Tren Analisis Pola Digital Kembali Naik, Banyak Disebut Mirip Gaya Berpikir Mahasiswa Generasi Z Fenomena Mahjong dan Pola Klik Digital yang Ternyata Punya Akurasi Tinggi di Tahun 2025 Mahjong 2025 Bukan Sekadar Game Tapi Fenomena Pola Data yang Sedang Diteliti Banyak Komunitas Pola Mahjong 2025 Disebut Lebih Stabil Banyak yang Kaget Melihat Hasil Analisis Digitalnya Pola Mahjong 2025 Jadi Sorotan Disebut Punya Irama Klik Unik yang Bikin Banyak Orang Penasaran Rahasia Pola Mahjong Mulai Terbongkar Komunitas Digital Temukan Pola Klik yang Tak Pernah Gagal Eksperimen Grid Staking 2–1–3–2 Versi Dimas UI, Tercatat Stabil 94,8% Dalam 50 Menit Pengujian Berlapis Fenomena Irama Scatter dari Tim Research Jogja, Ubah Cara Main Manual Jadi Auto Sync 4x Lebih Cepat Metode Pola Klik Ala Rani, Data Analyst Asal Bandung: Irama 1–2–1–3 Tembus Akurasi 96,2% Setelah 68 Menit Eksperimen Mandiri Model Data Wave Scatter dari Mahasiswa IT Malang Terbukti Bisa Aktifkan Wild Secara Bersamaan di Menit Ke-43 Pola Reverse Flow Buatan Komunitas Surabaya Diuji 15 Kali, Hasilnya Sinkron Dengan RTP PGSOFT 95,7% Tanpa Gangguan Server Investasi Rp50 Triliun Di KEK Galang-Batam Dorong Hilirisasi Bauksit dan Prospek Baru Bagi Masyarakat Kejaksaan Batam Ungkap Dugaan Korupsi Asuransi Aset PT Persero, Empat Tersangka Resmi Ditahan Menjelang Akhir Tahun, Harga Beras di Batam Terpantau Stabil Wali Kota Amsakar Pastikan Pasokan Aman Penyelundupan Sisik Trenggiling Senilai Rp1,2 Miliar Digagalkan di Pelabuhan Batam, Satu Tersangka Diamankan Warga Batam Siaga: BMKG Prediksi Hujan Petir & Gerimis Sepanjang Hari di Wilayah Kota Dari Bali Hingga Seoul, Tren Spa Ramah Lingkungan dan Filosofi Mahjong Ways Mulai Jadi Gaya Hidup Baru Di Balik Hening dan Aroma Kayu Manis: Pola Ketenangan yang Sama Seperti Saat Menemukan Irama di Mahjong Wins Gelombang Baru Wellness di Asia Pasifik: Saat Spa dan Pola Mahjong Wins Sama-Sama Bicara Tentang Kesabaran dan Irama Rahasia Di Balik Senyum Para Penerima APSWC 2025 Awards: Dari Pola Hidup Seimbang Hingga Filosofi Mahjong Ways Wellness Tak Lagi Sekadar Tren: Data Menunjukkan Pola Mahjong Ways dan Mindfulness Kini Jadi Arah Baru Dunia repository.tdjpublisher.com