Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara mengoptimalkan kueri MySQL ini? Jutaan Baris

Saya akan membuat indeks berikut (indeks b-tree):

analytics(user_id, source, id) 
transactions(analytics, status)

Ini berbeda dengan saran Gordon.

Urutan kolom dalam indeks itu penting.

Anda memfilter menurut analytics.user_id tertentu , jadi bidang ini harus menjadi yang pertama di indeks. Kemudian Anda mengelompokkan menurut analytics.source . Untuk menghindari pengurutan berdasarkan source ini harus menjadi bidang indeks berikutnya. Anda juga mereferensikan analytics.id , jadi lebih baik memiliki bidang ini sebagai bagian dari indeks, letakkan di akhir. Apakah MySQL mampu membaca hanya indeks dan tidak menyentuh tabel? Saya tidak tahu, tapi agak mudah untuk mengujinya.

Indeks pada transactions harus dimulai dengan analytics , karena akan digunakan dalam JOIN . Kami juga membutuhkan status .

SELECT 
    analytics.source AS referrer, 
    COUNT(analytics.id) AS frequency, 
    SUM(IF(transactions.status = 'COMPLETED', 1, 0)) AS sales
FROM analytics
LEFT JOIN transactions ON analytics.id = transactions.analytics
WHERE analytics.user_id = 52094 
GROUP BY analytics.source 
ORDER BY frequency DESC 
LIMIT 10 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menyimpan UUID sebagai string di mysql menggunakan JPA

  2. tidak dapat mengakses mysql dari baris perintah mac

  3. Hitung hari dalam rentang tanggal?

  4. Tolak pernyataan MySQL PDO jika nilai tertentu ditemukan di bidang?

  5. Pengguna dan kata sandi mysql yang di-hardcode di Node.js