首页 > 解决方案 > 加快sql INNER JOIN和LEFT JOIN组合语句

问题描述

希望提高以下 sql 语句的性能,因为这需要超过 7 秒来搜索 850,000 条记录。

select c.productTitle
     , c.catalogue_id
     , s1.catalogue_id
     , s1.cpc 
  FROM store s1 
  JOIN catalogue c 
    ON s1.catalogue_id = c.catalogue_id
  LEFT 
  JOIN store s2 
    ON (s1.catalogue_id = s2.catalogue_id AND s1.cpc < s2.cpc)
 WHERE s2.cpc IS NULL 
  AND c.productTitle LIKE '%user-query-here%'
GROUP 
   BY c1.catalogue_id 

我有一个包含 850,000 种产品(非重复)的目录表和一个包含每种产品销售价格的商店表,商店表可以有重复,因为多个卖家可以销售相同的产品。

目录表

| catalogue_id | productTitle      | barcode |
| 1            | washing machine   | abc     |
| 2            | dish washer       | def     |
| 3            | toaster           | ghi     |
| 4            | kettle            | jkl     |
| 5            | mobile phone 8gb  | mno     |

存储表

| product_id | catalogue_id      | cpc     |
| 1001       | 1                 | 0.01     |
| 2001       | 1                 | 0.02     |
| 3001       | 2                 | 0.05     |
| 4001       | 3                 | 0.01     |
| 5001       | 1                 | 0.05     |

预期成绩...

(按 catalogue_id 分组洗衣机,仅按最高每次点击费用 (cpc) 显示产品)

washing machine | 5001 | 0.05 
dish washer     | 3001 | 0.05
toaster         | 4001 | 0.01

问候

标签: mysqlsql

解决方案


我最好的猜测是大部分时间都花在AND c.productTitle LIKE '%user-query-here%'.

坏消息是你不能在这种情况下建立一个普通的索引,所以数据库必须遍历所有的记录并为每条记录执行子字符串匹配。

如果您想不出任何其他方法(即替换LIKE=),那么您需要的是全文搜索。好消息是 MySQL 有一个内置的 FTS 支持


推荐阅读