MySQL是将整行加载到内存中,还是仅将WHERE、ORDER BY和GROUP BY中使用的列加载到内存中?
我有一个表,它不是非常大的行(在100ks范围内),但是它包含大量的原始数据,这些数据的大小非常大。尽管行数相对较少,但大约为1.5GB 因此,在执行查询时,了解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
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