sql >> Databasteknik >  >> RDS >> Mysql

MySQL ELLER MATCH hänger (mycket långsamt) på flera bord

Jag hittade två saker som saktade ner min fråga drastiskt och fixade dem.

För att svara på det första problemet behövde det parenteser runt hela "MATCH MOT ELLER MATCH MOT":

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

Jag förstod inte hur man använder EXPLAIN SELECT , men det hjälpte ganska mycket, så tack! Detta minskade det första antalet 16076 rader till 143. Jag lade sedan märke till de andra två med över 23 och 25 tusen rader. Det var orsaken från den här raden:

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

Det fanns en anledning till att jag gjorde det här från början, som sedan ändrades. När jag ändrade det insåg jag inte att jag kunde göra en normal LEFT JOIN :

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

Detta gör min sista fråga så här:(och MYCKET snabbare gick från de 196 sekunderna till 0,0084 eller så)

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, och redan innan jag gjorde en fulltextsökning med flera tabeller tog det ungefär 1/2 sekund. Detta är mycket förbättrat.




  1. Analysera XML-kommentarer i Oracle

  2. MySQL Gå med och få alla relationer även om 0

  3. ORA-02298 Föräldernycklar hittades inte?

  4. cx_Oracle:Använder PL/SQL RECORD-typer som argument till lagrade procedurer