sql >> Databáze >  >> RDS >> Mysql

MySQL OR MATCH visí (velmi pomalu) na více tabulkách

Našel jsem 2 věci, které výrazně zpomalily můj dotaz, a opravil jsem je.

Aby bylo možné odpovědět na první problém, potřebovalo to závorky kolem celého „MATCH PROTI OR MATCH PROTI“:

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

Nerozuměl jsem, jak používat EXPLAIN SELECT , ale docela to pomohlo, takže děkuji! To snížilo první číslo 16076 řádků na 143. Pak jsem si všiml dalších dvou s více než 23 a 25 tisíci řádky. To byla příčina z tohoto řádku:

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

Na prvním místě byl důvod, proč jsem to dělal, který se pak změnil. Když jsem to změnil, neuvědomil jsem si, že mohu provést normální LEFT JOIN :

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

Díky tomu je můj poslední dotaz takto:(a MNOHEM rychleji přešel ze 196 sekund na 0,0084 nebo tak nějak)

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

Jo, a ještě předtím, než jsem prováděl fulltextové vyhledávání s více tabulkami, to trvalo asi 1/2 sekundy. To je mnohem lepší.




  1. Zkontrolujte, zda existuje spoušť

  2. seznam všech tabulek v databázi s MySQLi

  3. Podat databázi SQLite do Heroku klepnutím?

  4. Rails Octopus Gem - Chování připojení replikace Master-Slave, když je slave mimo provoz