sql >> Database >  >> RDS >> Mysql

MySQL OR MATCH loopt vast (erg traag) op meerdere tafels

Ik heb 2 dingen ontdekt die mijn zoekopdracht drastisch vertraagden en deze verholpen.

Om het eerste probleem te beantwoorden, had het haakjes nodig rond de hele "MATCH TEGEN OF 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 )
    )

Ik begreep niet hoe ik EXPLAIN SELECT . moest gebruiken , maar het heeft aardig geholpen, dus bedankt! Dit verminderde dat eerste aantal 16076 rijen tot 143. Ik merkte toen de andere twee op met meer dan 23 en 25 duizend rijen. Dat was de oorzaak van deze regel:

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

Er was een reden dat ik dit in de eerste plaats deed, die toen veranderde. Toen ik het veranderde, realiseerde ik me niet dat ik een normale LEFT JOIN . kon doen :

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

Dit maakt mijn laatste vraag als volgt:(en VEEL sneller ging van de 196 seconden naar 0,0084 of zo)

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, en zelfs voordat ik de volledige tekst doorzocht met meerdere tabellen, duurde het ongeveer een halve seconde. Dit is veel verbeterd.




  1. MySQL/PHP - paginanummer paginering Toon slechts 10 pagina's soms

  2. Databasegrootte anders na export/import

  3. WAMP en mysqli::real_connect():(HY000/2002)?

  4. Tijdstempel zonder wijziging bij update