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

Doctrine Paginator memilih seluruh tabel (sangat lambat)?

Anda harus menyederhanakan kueri Anda. Itu akan memangkas beberapa waktu eksekusi. Saya tidak dapat menguji kueri Anda, tetapi berikut beberapa petunjuknya:

  • jangan lakukan pengurutan saat menjalankan count()
  • Anda dapat mengurutkan berdasarkan orderBy('p.id', 'DESC') , indeks akan digunakan
  • bukan leftJoin() anda bisa menggunakan join() jika setidaknya satu record selalu ada di tabel bergabung. Jika tidak, catatan tersebut akan dilewati.
  • KNP/Paginator menggunakan DISTINCT() untuk membaca hanya record yang berbeda, tetapi hal itu dapat menyebabkan penggunaan tabel tmp disk
  • $query->getArrayResult() menggunakan mode hidration array, yang mengembalikan array multidimensi dan jauh lebih cepat daripada hidration objek untuk kumpulan hasil yang besar
  • Anda dapat menggunakan select('partial p.{id, other used fields}') parsial , dengan cara ini Anda hanya akan memuat bidang yang diperlukan, mungkin melewatkan hubungan yang tidak diperlukan saat menggunakan hidrasi objek
  • periksa SF profiler JELASKAN pada kueri yang diberikan di bawah bagian doktrin, mungkin indeks tidak digunakan
  • apakah p.hashtags dan p.likes hanya mengembalikan satu baris atau oneToMany, yang mengalikan hasil
  • mungkin beberapa perubahan desain Postingan, yang akan menghapus beberapa gabungan:
    • memiliki bidang p.hashtags yang didefinisikan sebagai @ORM\Column(type="array") dan telah menyimpan nilai string tag. Nanti mungkin menggunakan pencarian teks lengkap pada array serial.
    • memiliki bidang p.likesCount yang didefinisikan sebagai @ORM\Column(type="integer") yang akan memiliki jumlah suka

Saya menggunakan KnpLabs/KnpPaginatorBundle dan juga dapat memiliki masalah kecepatan untuk kueri yang kompleks.

Biasanya menggunakan LIMIT x,z lambat untuk DB, karena menjalankan COUNT di seluruh dataset. Jika indeks tidak digunakan, prosesnya sangat lambat.

Anda dapat menggunakan pendekatan yang berbeda dan melakukan beberapa pagination khusus dengan memajukan ID, tetapi itu akan memperumit pendekatan Anda. Saya telah menggunakan ini dengan kumpulan data besar seperti tabel SYSLOG. Tetapi Anda kehilangan fungsi penyortiran dan penghitungan catatan total.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Membangun pernyataan UPDATE menggunakan array asosiatif di PHP

  2. Cara Membuat Database dari Script di MySQL

  3. MYSQL ERROR 1096 - TIDAK ADA TABEL YANG DIGUNAKAN - CODEIGNITER

  4. Bagaimana cara memilih semua kolom di sql kecuali satu kolom?

  5. Tulis Pandas DataFrame ke database MySQL