Mariadb 我应该在具有大量数据的表上使用WITH而不是JOIN吗?

Mariadb 我应该在具有大量数据的表上使用WITH而不是JOIN吗?,mariadb,Mariadb,我有一个MariaDB表,它包含大量元数据,字节非常大 我在表A中有A列,B列和其他列 我想将该表与另一个表连接起来,以便从中获得C列 所以我有点像: SELECT metadata.A, metadata.B, stuff.C FROM metadata JOIN stuff on metadata.D = stuff.D 这个查询有时需要很长时间,我怀疑这是因为有问题,请纠正我,如果我错了,JOIN将连接结果存储在某个副表中,并且由于元数据表非常大,即使我不使用它,它也必须复制大量数据,因

我有一个MariaDB表,它包含大量元数据,字节非常大

我在表A中有A列,B列和其他列

我想将该表与另一个表连接起来,以便从中获得C列

所以我有点像:

SELECT metadata.A, metadata.B, stuff.C FROM metadata JOIN
stuff on metadata.D = stuff.D
这个查询有时需要很长时间,我怀疑这是因为有问题,请纠正我,如果我错了,JOIN将连接结果存储在某个副表中,并且由于元数据表非常大,即使我不使用它,它也必须复制大量数据,因此我考虑如下优化它:

WITH m as (SELECT A,B,D FROM metadata),
     s as (SELECT C,D FROM stuff)
SELECT * FROM m JOIN s ON m.D = s.D;
使用EXPLAIN的执行计划是相同的,但我认为它会更快,因为WITH AFAIK WITH创建的副表也会创建副表,如果Im错误,请更正我,因为它会更小,并且只包含所需的数据


我的逻辑正确吗?在MariaDB中有什么方法可以测试吗?

更有可能的是,有某种形式的缓存加速了一个或另一个查询

查询缓存通常只需大约1ms的查询时间即可识别。它可以通过选择SQL\u NO\u缓存关闭。。。以获得与之比较的时间

另一个可能的缓存是缓冲池。数据从磁盘读取到缓冲池中,除非它已经存在。对于奇怪的计时,简单的解决方法是运行查询两次,然后再执行第二次

您关于WITH创建“小”临时表的假设会因为读取原始表所需的工作而崩溃,无论是否使用WITH都是一样的

请为这两个表提供SHOW CREATE TABLE。可能涉及到两个数据类型问题—大文本或blob


新添加的WITH打开了递归CTE和其他东西的可能性。它提供了一种具体化多次使用的临时表的方法。这两种方法都不适用于您的查询,因此我不希望有任何性能改进。

我删除了mysql标记,因为您说您正在使用mariadb。MariaDB中CTE的实现可以追溯到2016-07-04年10月2日,而MySQL在2017-04-10年8.0.1引入了对CTE的支持。关于需要同样工作来读取表的部分,使用它只读取3列来创建临时表,而使用JOIN它需要读取所有数据来创建临时表,不是吗?没有BLOB,只有一个文本,但不是很大,很快将提供一个show create表。