MySQL是将整行加载到内存中,还是仅将WHERE、ORDER BY和GROUP BY中使用的列加载到内存中?

MySQL是将整行加载到内存中,还是仅将WHERE、ORDER BY和GROUP BY中使用的列加载到内存中?,mysql,database,performance,memory,Mysql,Database,Performance,Memory,我有一个表,它不是非常大的行(在100ks范围内),但是它包含大量的原始数据,这些数据的大小非常大。尽管行数相对较少,但大约为1.5GB 因此,在执行查询时,了解MySQL是将整行加载到内存中,还是只将WHERE、ORDER BY和GROUP BY中使用的列和索引加载到内存中,以及将其余列加载到最后,这一点非常重要 一个示例查询: SELECT HugeDataTable.*, Table2.Name FROM Table1 LEFT JOIN Table2 ON Table1.`ID` = T

我有一个表,它不是非常大的行(在100ks范围内),但是它包含大量的原始数据,这些数据的大小非常大。尽管行数相对较少,但大约为1.5GB

因此,在执行查询时,了解MySQL是将整行加载到内存中,还是只将WHERE、ORDER BY和GROUP BY中使用的列和索引加载到内存中,以及将其余列加载到最后,这一点非常重要

一个示例查询:

SELECT HugeDataTable.*, Table2.Name
FROM Table1
LEFT JOIN Table2 ON Table1.`ID` = Table2.`Table1ID` 
LEFT JOIN HugeDataTable FORCE INDEX(RowOrder) ON Table2.`ID` = HugeDataTable.`Table2ID` 
WHERE HugeDataTable.Category = 5 AND Table1.ExampleColumn = integerExampleValue
AND HugeDataTable.RowOrder >10000 AND HugeDataTable.ID <> "h4324h534"
ORDER BY HugeDataTable.`RowOrder` DESC LIMIT 18 ;

下次你问这样的问题时,能不能把解释计划包括进去

通常,对于左联接,mysql将在联接之前解析表,在联接之后解析表(尽管不总是),因此它将首先读取表1中的行,然后读取表2中的行,然后读取HugeDataable

但是您的问题相当混乱-您不需要在查询的输出中包括WHERE、orderby和groupby中的列。选择*从来都不是个好主意。唯一需要注意的是,如果查询中需要多个列的组合,则无法充分利用查询缓存

但是这个查询在很多其他方面都非常高效。为什么在一个双左连接的表中按值排序和限制?即使您的数据完整性完全受损,也有比这更好的解决方案。正如Aconard所说,您已经实现了一个非常昂贵的内部连接,而不是这里的左连接


强制索引通常是获得错误执行计划的好方法。

您能提供表结构或至少它们的索引吗?和。。如果在WHERE HUGEDATABLE中有,LEFT JOIN HUGEDATABLE实际上是内部JOIN HUGEDATABLE。Category=5索引为行顺序、类别,主键为ID。此外,表的ID为主键,Table1ID和Table2ID为索引/外键。我目前无法访问数据库,因此无法提供解释。。对不起(我知道SELECT*非常糟糕,但在这种情况下,我需要HugeDataTable返回的所有列,这就是我使用它的原因。这就是为什么我问是否只使用where语句中的一些列,其余的稍后加载。有没有办法避免SELECT*而从HugeDataTable获取所有列?至于对数据进行排序、排序和限制,前两个表充当过滤器,同时从最后一个表检索数据。在我使用的应用程序中,对分页进行排序和限制,以从某个偏移量返回前18行。(这就是RowOrder>xxxx的位置)然而,我不太明白为什么它被认为是一个内部连接,而且是一个昂贵的连接。请你详细说明一下好吗?@left=内部连接:一个左连接b匹配表a和b中的行,或者只匹配a中的行。如果你的WHERE有b.field=非NULL的值,它是无点的。我读了链接。那么,我应该使用一个普通的内部连接,而不是除了左连接之外?是否也可以使用SELECT*但从HugeDataTable检索所有数据?
id  select_type  table          type    possible_keys                       key               key_len  ref                           rows   Extra                     
1   SIMPLE       HugeDataTable  range   Table2ID,Category,RowOrder          RowOrder          9                                      49591  Using where               
1   SIMPLE       Table2         eq_ref  PRIMARY                             PRIMARY           10       const,HugeDataTable.Table2ID  1      Using where; Using index  
1   SIMPLE       Table1         ref     PRIMARY                             PRIMARY           2        Table2.Table1ID               1