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

mysql - Mengoptimalkan ORDER BY COALESCE pada kolom tabel yang digabungkan

Masalahnya di sini adalah seperti yang saya jelaskan di pembaruan 2 dari pertanyaan saya. MySQL menggunakan indeks untuk melakukan operasi ORDER BY dengan cepat. Lebih khusus lagi, MySQL menggunakan B-trees untuk mengindeks kolom (seperti stempel waktu - p.time/r.time), yang menggunakan sedikit lebih banyak ruang tetapi memungkinkan penyortiran lebih cepat.

Masalah dengan kueri saya adalah bahwa itu mengurutkan berdasarkan kolom waktu dalam dua tabel, menggunakan stempel waktu dari tabel repost jika tersedia, dan tabel posting sebaliknya. Karena MySQL tidak dapat menggabungkan B-tree dari kedua tabel, MySQL tidak dapat melakukan pengurutan indeks cepat pada kolom dari dua tabel yang berbeda.

Saya memodifikasi kueri dan struktur tabel saya dalam dua cara untuk menyelesaikan ini.

1) Lakukan penyaringan berdasarkan pengguna yang diblokir terlebih dahulu, sehingga pemesanan hanya dilakukan pada postingan yang dapat diakses oleh pengguna saat ini. Ini bukan akar masalahnya, tetapi optimasi praktis. misalnya

SELECT * FROM (SELECT * FROM Post p WHERE p.author_id NOT IN (4, 5, 6...))...

2) Perlakukan setiap posting sebagai repost oleh penulisnya, sehingga setiap posting dijamin memiliki repost dan repost yang dapat digabungkan. Waktu untuk mengindeks dan menyortir. misalnya

SELECT * FROM (...) LEFT JOIN p.reposts repost ON (p.id = repost.post_id AND 
repost.time = (
  SELECT MIN(r.time) FROM Repost r WHERE p.id = r.post_id
  AND r.user_id IN (1, 2, 3...) AND r.user_id NOT IN (4, 5, 6...))
))
WHERE (repost.id IS NOT NULL) ORDER BY repost.time DESC LIMIT 0, 10

Pada akhirnya, masalahnya adalah ORDER BY - pendekatan ini mengurangi waktu kueri dari sekitar 8 detik menjadi 20 md.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tampilkan semua tanggal antara, bahkan jika tidak ada hasil

  2. Mysqli bergabung dengan tabel dari 2 database yang berbeda

  3. Bagaimana cara menyalin baris dan menyisipkan di tabel yang sama dengan bidang peningkatan otomatis di MySQL?

  4. Bagaimana cara menyimpan Simbol Euro di database mysql?

  5. JDBC mengembalikan Pengecualian MySQLSyntaxError dengan pernyataan yang benar