Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL OR MATCH bị treo (rất chậm) trên nhiều bảng

Tôi nhận thấy có 2 điều làm chậm truy vấn của mình một cách đáng kể và đã khắc phục chúng.

Để trả lời vấn đề đầu tiên, nó cần dấu ngoặc đơn xung quanh toàn bộ "TRẬN ĐẤU HOẶC TRẬN ĐẤU LẠI":

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 )
    )

Tôi không hiểu cách sử dụng EXPLAIN SELECT , nhưng nó đã giúp được một chút, vì vậy cảm ơn bạn! Điều này làm giảm số 16076 hàng đầu tiên đó xuống còn 143. Sau đó, tôi nhận thấy hai hàng còn lại với hơn 23 và 25 nghìn hàng. Đó là nguyên nhân từ dòng này:

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

Có một lý do khiến tôi làm việc này ngay từ đầu, sau đó đã thay đổi. Khi tôi thay đổi nó, tôi không nhận ra rằng tôi có thể thực hiện LEFT JOIN bình thường :

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

Điều này làm cho truy vấn cuối cùng của tôi như thế này:(và nhanh hơn MUCH từ 196 giây xuống 0,0084 hoặc lâu hơn)

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

Ồ, và thậm chí trước khi tôi thực hiện tìm kiếm toàn văn với nhiều bảng, nó mất khoảng 1/2 giây. Điều này đã được cải thiện nhiều.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết nối MySQL với Apache nutch

  2. Heroku MySQL Auto Increment

  3. Tại sao truy vấn nhiều cột của tôi chậm hơn đáng kể so với các truy vấn cột đơn tương ứng, ngay cả với chỉ mục nhiều cột?

  4. một cách lâu dài để thực hiện mysqli-> set_charset ()?

  5. Quốc gia và trạng thái thả xuống động Laravel