sql >> データベース >  >> RDS >> Mysql

MySQL OR MATCHが複数のテーブルでハングする(非常に遅い)

    クエリが大幅に遅くなることが2つあることがわかり、修正しました。

    最初の問題に答えるには、「MATCH AGAINST OR MATCHAGAINST」全体を括弧で囲む必要がありました:

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

    EXPLAIN SELECTの使い方がわかりませんでした 、でもかなり助かりましたので、よろしくお願いします!これにより、最初の数は16076行から143行に減少しました。次に、他の2つが23,000行と25,000行を超えていることに気付きました。それがこの行の原因でした:

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

    そもそもこれをやっていたのには理由があり、それが変わった。変更したとき、通常のLEFT JOINができることに気づきませんでした。 :

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

    これにより、私の最終的なクエリは次のようになります:(そして196秒から0.0084程度にはるかに速くなりました)

    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
    

    ああ、そして私が複数のテーブルで全文検索をする前でさえ、それは約1/2秒かかっていました。これは大幅に改善されています。




    1. 2つのテーブルを持つMysqlクエリphp

    2. Visual Studio 2010 EF4でMySQLを使用するにはどうすればよいですか?

    3. SQL Serverでレコードを削除した後、IDシードをリセットします

    4. SQL Serverのリンクサーバーから列情報を返す(T-SQLの例)