Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL OR MATCH zawiesza się (bardzo wolno) na wielu stołach

Znalazłem dwie rzeczy, które drastycznie spowalniały moje zapytanie i naprawiłem je.

Aby odpowiedzieć na pierwszy problem, potrzebne były nawiasy wokół całego „PASUJ PRZECIW LUB DOPASUJ PRZECIW”:

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

Nie rozumiałem, jak używać EXPLAIN SELECT , ale to trochę pomogło, więc dziękuję! To zmniejszyło pierwszą liczbę 16076 wierszy do 143. Potem zauważyłem pozostałe dwa z ponad 23 i 25 tysiącami wierszy. To był powód z tej linii:

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

Był powód, dla którego to robiłem, a potem się zmienił. Kiedy to zmieniłem, nie zdawałem sobie sprawy, że mogę wykonać normalne LEFT JOIN :

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

To sprawia, że ​​moje ostatnie zapytanie wygląda tak:(i DUŻO szybciej przeszło od 196 sekund do 0,0084 lub więcej)

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

Aha, i nawet zanim zacząłem przeszukiwać cały tekst z wieloma tabelami, zajmowało to około 1/2 sekundy. Jest to znacznie ulepszone.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SELECT zapytanie zwraca 1 wiersz z każdej grupy

  2. Usuwanie ilości z wielu wierszy w bazie danych

  3. mysql zmienia wszystkie wartości w kolumnie

  4. Biblioteka muzyczna Baza danych MySQL

  5. Jak wstawić znak mb4 utf-8 (emotikony w ios5) w mysql?