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

MySQL ATAU MATCH hang (sangat lambat) di beberapa tabel

Saya menemukan 2 hal yang memperlambat kueri saya secara drastis dan memperbaikinya.

Untuk menjawab soal pertama, diperlukan tanda kurung di sekeliling "MATCH AGAINST OR MATCH AGAINST":

WHERE 
    b.`website_id` = %d
    AND b.`status` = %d
    AND b.`active` = %d 
    AND ( 
        MATCH( a.`name`, a.`sku`, a.`description` ) AGAINST ( '%s' IN BOOLEAN MODE ) 
        OR MATCH ( d.`name` ) AGAINST ( '%s' IN BOOLEAN MODE )
    )

Saya tidak mengerti cara menggunakan EXPLAIN SELECT , tapi itu cukup membantu, jadi terima kasih! Ini mengurangi angka pertama 16076 baris menjadi 143. Saya kemudian melihat dua lainnya dengan lebih dari 23 dan 25 ribu baris. Itu penyebabnya dari baris ini:

LEFT JOIN ( SELECT `product_id`, `image`, `swatch` FROM `product_images` WHERE `sequence` = 0) AS c 
    ON (a.`product_id` = c.`product_id`)

Ada alasan mengapa saya melakukan ini sejak awal, yang kemudian berubah. Ketika saya mengubahnya, saya tidak menyadari bahwa saya dapat melakukan LEFT JOIN yang normal :

LEFT JOIN `product_images` AS c 
    ON (a.`product_id` = c.`product_id`)

Ini membuat kueri terakhir saya seperti ini:(dan JAUH lebih cepat berubah dari 196 detik menjadi 0,0084 atau lebih)

SELECT 
    a.`product_id`, a.`name`, a.`slug`, a.`description`, b.`list_price`, b.`price`, 
    c.`image`, c.`swatch`, e.`name` AS industry, 
    MATCH( a.`name`, a.`sku`, a.`description` ) AGAINST ( '%s' IN BOOLEAN MODE ) AS relevance 
FROM 
    `products` AS a LEFT JOIN `website_products` AS b 
        ON (a.`product_id` = b.`product_id`) 
    LEFT JOIN `product_images` AS c 
        ON (a.`product_id` = c.`product_id`) 
    LEFT JOIN `brands` AS d 
        ON (a.`brand_id` = d.`brand_id`) 
    INNER JOIN `industries` AS e 
        ON (a.`industry_id` = e.`industry_id`) 
WHERE 
    b.`website_id` = %d
    AND b.`status` = %d
    AND b.`active` = %d
    AND c.`sequence` = %d
    AND ( 
        MATCH( a.`name`, a.`sku`, a.`description` ) AGAINST ( '%s' IN BOOLEAN MODE ) 
        OR MATCH( d.`name` ) AGAINST( '%s' IN BOOLEAN MODE ) 
    )
GROUP BY a.`product_id` 
ORDER BY relevance DESC 
LIMIT 0, 9

Oh, dan bahkan sebelum saya melakukan pencarian teks lengkap dengan beberapa tabel, butuh sekitar 1/2 detik. Ini jauh lebih baik.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP mysql mencari beberapa tabel menggunakan kata kunci

  2. MySQL VARCHAR menyukai Tipe data dengan panjang karakter MIN dan MAX

  3. Cara mendapatkan nilai yang dihitung dengan pemisah koma sebagai nilai baris tunggal

  4. urutkan rollup dalam grup berdasarkan

  5. java.sql.SQLException:Tidak ada database yang dipilih - mengapa?