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

Optimalkan permintaan MySQL untuk menghindari Menggunakan di mana; Menggunakan sementara; Menggunakan filesort

SELECT  id, name, last_reply, replies
FROM    (
        SELECT  topic_id, MAX(date) AS last_reply, COUNT(*) AS replies
        FROM    wp_pod_tbl_forum
        GROUP BY
                topic_id
        ) r
JOIN    wp_pod_tbl_forum t
ON      t.topic_id = 0
        AND t.id = r.topic_id
UNION ALL
SELECT  id, name, date, 0
FROM    wp_pod_tbl_forum t
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    wp_pod_tbl_forum r
        WHERE   r.topic_id = t.id
        )
        AND t.topic_id = 0
ORDER BY
       date DESC
LIMIT 0, 20

Jika tabel Anda adalah MyISAM atau id bukan PRIMARY KEY , Anda perlu membuat ondex komposit di (topic_id, id) .

Jika tabel Anda adalah InnoDB dan id adalah PRIMARY KEY , indeks tepat di (topic_id) akan melakukan (id akan ditambahkan secara implisit ke indeks).

Perbarui

Kueri ini kemungkinan besar akan lebih efisien, asalkan Anda memiliki indeks di (topic_id, id) dan (date, id) :

Lihat artikel ini di blog saya untuk detail kinerja:

Kueri ini selesai dalam 30 ms pada 100,000 data contoh baris:

SELECT  id, name, last_reply,
        (
        SELECT  COUNT(*)
        FROM    wp_pod_tbl_forum fc
        WHERE   fc.topic_id = fl.topic_id
        ) AS replies
FROM    (
        SELECT  topic_id, date AS last_reply
        FROM    wp_pod_tbl_forum fo
        WHERE   id = (
                SELECT  id
                FROM    wp_pod_tbl_forum fp
                WHERE   fp.topic_id = fo.topic_id
                ORDER BY
                        fp.date DESC, fp.id DESC
                LIMIT 1
                )
                AND fo.topic_id <> 0
        ORDER BY
                fo.date DESC, fo.id DESC
        LIMIT 20
        ) fl
JOIN    wp_pod_tbl_forum ft
ON      ft.id = fl.topic_id
UNION ALL
SELECT  id, name, date, 0
FROM    wp_pod_tbl_forum t
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    wp_pod_tbl_forum r
        WHERE   r.topic_id = t.id
        )
        AND t.topic_id = 0
ORDER BY
       last_reply DESC, id DESC
LIMIT  20

Kedua indeks diperlukan agar kueri ini efisien.

Jika tabel Anda adalah InnoDB dan id adalah PRIMARY KEY , maka Anda dapat menghilangkan id dari indexes di atas.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mendapatkan tanggal &waktu saat ini di MySQL?

  2. apache mysql - paket rusak pada 3306

  3. Mendapatkan perbedaan waktu antara dua kali di PHP

  4. Permintaan MySQL dengan Gabung Kiri terlalu lambat

  5. Cara menggunakan 'memiliki' dengan paginate pada kolom hubungan di laravel 5