mysql - 加快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
问候
解决方案
我最好的猜测是大部分时间都花在AND c.productTitle LIKE '%user-query-here%'
.
坏消息是你不能在这种情况下建立一个普通的索引,所以数据库必须遍历所有的记录并为每条记录执行子字符串匹配。
如果您想不出任何其他方法(即替换LIKE
为=
),那么您需要的是全文搜索。好消息是 MySQL 有一个内置的 FTS 支持。
推荐阅读
- python - 附加列表给出了不同的结果以打印结果
- python - 无法在python中连接到远程设备
- java - 如何从注册 Servlet 调度到登录 Servlet POST 方法
- javascript - 从数据列表中选择的查看选项
- ios - 如何在搜索栏上设置更改占位符颜色?
- c - 将可变长度数组声明为宏
- javascript - 如何有效地对 JavaScript 和 CSS 文件进行版本控制?
- netbeans - 为什么我不能在 netbeans 8.2 中使用调色板?
- angular - Angular 单元测试单个服务上的多个 getter
- ruby-on-rails - 从ruby中的嵌套数组打印单个元素