mysql - 加速使用全文连接的 SQL 查询

标签 mysql database performance join left-join

我遇到这样一种情况,我需要从产品数据库JOIN 和内部查询,按名称对项目进行分组,然后使用名称列执行连接,因此:

SELECT p.*, p3.variants, sl.id, l.name as locationName FROM products p
LEFT JOIN (SELECT item, count(DISTINCT id) as variants FROM products GROUP BY item) p3 
ON p3.item = p.item
LEFT JOIN stockLevels sl ON sl.id=p.id 
LEFT JOIN locations l ON l.id=sl.stockLocation AND l.showStock='1' 
WHERE p.id='10459' GROUP BY p.id

在弄乱了 JOIN 的顺序和查询本身之后,我确定首先创建这个内部表并执行第一个所需的连接会对查询速度产生影响,但是内部连接 ​​(SELECT item, count(DISTINCT id) as variants FROM products GROUP BY item) 给出(目前)7034 行,这是不必要的,因为只需要大约 5 行。

如果我将内部连接修改为:

(SELECT item, count(DISTINCT id) as variants 
 FROM products *WHERE item LIKE '%SOME VALUE%'* GROUP BY item)

这显然减少了内部连接返回的行数,而且速度大约是原来的两倍。

但是,我不能这样做,因为我没有可用于内部 where 子句的已知值。

有什么方法可以将外部表的结果带入内部表并生成引用外部表的内部查询,即:

SELECT p.*, p3.variants, sl.id, l.name as locationName FROM products p
LEFT JOIN (SELECT item, count(DISTINCT id) as variants 
FROM products *WHERE item LIKE p.item * GROUP BY item) p3  << New Where Clause
ON p3.item = p.item
LEFT JOIN stockLevels sl ON sl.id=p.id 
LEFT JOIN locations l ON l.id=sl.stockLocation AND l.showStock='1' 
WHERE p.id='10459' GROUP BY p.id

我知道我上面写的东西行不通,也明白为什么,但是有什么方法可以让我在这些方面有所作为吗?

以目前我数据库中的记录数量来看,这实际上不是问题,数据返回的速度非常快,但我可以想象,随着时间的推移,当数据增长时,它可能会成为问题。

请注意,我确实考虑过制作一个 parentId 整数列,而不是按 FullText item 分组,但我的应用程序中还有很多其他问题,但它没有' 似乎无论如何都加快了查询速度,出于与上面列出的相同原因,内部仍然必须返回所有行

另请注意,这是MySQL

如果它有帮助,这里是 EXPLAIN

的输出

enter image description here

最佳答案

您可以在 SELECT 子句中放置相关子查询:

SELECT p.*, sl.id, l.name as locationName,
       (SELECT COUNT(distinct id)
        FROM products p3
        WHERE p3.item = p.item) as variants
FROM products p
LEFT JOIN stockLevels sl ON sl.id=p.id 
LEFT JOIN locations l ON l.id=sl.stockLocation AND l.showStock='1' 
WHERE p.id='10459' GROUP BY p.id

关于mysql - 加速使用全文连接的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18800097/

相关文章:

mysql - 如何正确地在 MySQL 表中搜索数据

MySQL在wordpress中使用ajax选择查询

sql-injection - 增加 DB INSERT 的安全性

sql - 在 SQL View 中更改多个列名称

performance - 为redis中的所有键设置过期是一种好习惯吗

c# - 更快的枚举 : Leveraging Array Enumeration

Mysql 删除表中的重复条目

php - 从数据库填充的下拉列表不使用 PHP 记录选定的选项

mysql - 从 MySql 导出到 sql 文件时如何自动转义内容中的引号?

algorithm - 排序算法的效率