sql >> Database teknologi >  >> RDS >> Mysql

MySQL ELLER MATCH hænger (meget langsomt) på flere borde

Jeg fandt 2 ting, der gjorde min forespørgsel drastisk langsommere og rettede dem.

For at besvare det første problem krævede det parenteser omkring hele "MATCH MOD 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 )
    )

Jeg forstod ikke, hvordan jeg brugte EXPLAIN SELECT , men det hjalp en del, så tak! Dette reducerede det første antal 16076 rækker til 143. Så lagde jeg mærke til de to andre med over 23 og 25 tusinde rækker. Det var årsagen fra denne linje:

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

Der var en grund til, at jeg gjorde dette i første omgang, som så ændrede sig. Da jeg ændrede det, var jeg ikke klar over, at jeg kunne lave en normal LEFT JOIN :

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

Dette gør min sidste forespørgsel sådan her:(og MEGET hurtigere gik fra de 196 sekunder til 0,0084 eller deromkring)

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

Åh, og selv før jeg lavede en fuldtekstsøgning med flere tabeller, tog det omkring 1/2 sekund. Dette er meget forbedret.




  1. Opret stort heltal fra den store ende af en uuid i PostgreSQL

  2. Sådan opretter du en krydstabuleringsforespørgsel i designvisning i Access

  3. Grupperet sammenkædning i SQL Server

  4. Venstre Forbind laterale og array-aggregater