Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL OR MATCH hängt (sehr langsam) an mehreren Tabellen

Ich habe 2 Dinge gefunden, die meine Abfrage drastisch verlangsamen, und habe sie behoben.

Um das erste Problem zu lösen, brauchte es Klammern um das gesamte "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 )
    )

Ich habe nicht verstanden, wie man EXPLAIN SELECT verwendet , aber es hat ziemlich geholfen, also danke! Dies reduzierte die erste Zahl von 16076 Zeilen auf 143. Dann bemerkte ich die anderen beiden mit über 23 und 25.000 Zeilen. Das war Ursache von dieser Zeile:

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

Es gab einen Grund, warum ich das überhaupt gemacht habe, der sich dann geändert hat. Als ich es geändert habe, war mir nicht klar, dass ich einen normalen LEFT JOIN machen könnte :

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

Das macht meine letzte Abfrage so:(und VIEL schneller ging von den 196 Sekunden auf 0,0084 oder so)

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, und noch bevor ich eine Volltextsuche mit mehreren Tabellen durchführte, dauerte es ungefähr 1/2 Sekunde. Dies wurde erheblich verbessert.