Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MySQL中的where子句是如何工作的?_C++_C_Mysql - Fatal编程技术网

C++ MySQL中的where子句是如何工作的?

C++ MySQL中的where子句是如何工作的?,c++,c,mysql,C++,C,Mysql,我有一个疑问。假设R和S分别是属性A和B的两个关系。如果我有疑问 Select * From R, S Where R.A = S.B 这是否像C或C++ +/P>中的双循环? For( i=0; i<n; i++) For( j=0; j<n; j++) if (i == j) //DO some work For(i=0;i功能方面,是的。它就是这样工作的。您可以想象它在嵌套的For循环中遍历两个表中的所有行,并且只选择字段

我有一个疑问。假设R和S分别是属性A和B的两个关系。如果我有疑问

Select * 
From R, S
Where R.A = S.B 

这是否像C或C++ +/P>中的双循环?

For( i=0; i<n; i++)
    For( j=0; j<n; j++)
        if (i == j)
           //DO some work 

For(i=0;i功能方面,是的。它就是这样工作的。您可以想象它在嵌套的For循环中遍历两个表中的所有行,并且只选择字段匹配的行


在实现方面,情况大不相同。数据库引擎使用多种优化来加速查询。数据库引擎实际执行查询的方式取决于许多因素,例如数据库引擎的类型(非常重要)索引、数据量等。

首先:不知道mysql将如何在内部优化查询(不知道mysql的内部结构)

在纯关系数据库中,换句话说,这就是您正在做的:

SELECT*FROM R,S
->执行交叉连接,生成所有(R,S)元组

其中R.A=S.B
->现在选择具有这种行为的元组


因此,它将遍历所有元组(或多或少类似于您的代码)但是,mysql完全有可能在内部将其简化为一个更高效的内部联接,该联接不会创建所有元组,而只创建
R.a=S.B
有效的元组。

是的,至少在概念上是这样。联接会创建两个表中元素的笛卡尔交叉,这就是您对两个循环所做的,而Where子句限制条件为true的笛卡尔十字的成员。当然,实现不会实际创建整个笛卡尔十字;它将使用索引来标识匹配项,而无需进行所有成对比较。

如果这些属性中的任何一个都没有索引,则这正是MySQL必须要做的,而且它可能非常低效

不过,拥有索引让世界变得完全不同。例如,如果S.B上有索引,那么MySQL可以做更多类似的事情:

for (i=0; i<n_r; i++) { // loop over all rows in R
    matching_rows = retrieve_from_index_s_b(i); // very fast operation, like direct array access
    for (j=0; j<matching_rows.length(); j++)
        // do some work 
}

for(i=0;i您所描述的是一个
嵌套循环
连接策略。优化者可以选择此连接策略或其他连接策略(可用选项将取决于RDBMS)


选择哪一个取决于各种问题,包括连接条件(例如,一些仅适用于Equijoin),数据是否已排序、可用内存量、表大小、索引可用性等。

这反映了对SQL是什么的某种误解。SQL的要点是描述所需结果的性质,而底层SQL引擎设计的查询计划可以最有效地创建结果集。该计划的外观取决于每次运行查询时可能会发生变化的统计信息和索引。简短版本为“否,如果表已正确索引”。我希望有一种方法可以知道MySQL将如何优化查询。它是确定性的,不是吗?因此,了解MySQL内部结构的人应该能够描述MySQL的功能。而且它是开源的,对吗?任何足够专注的人都应该能够研究该程序并了解MySQL的功能。好的,是的,如果你知道implem的话你可以知道:)@Rob Kennedy:有一种方法可以知道MySQL会做什么——解释选择。只需查看查询并了解索引,你就可以尝试猜测MySQL会做什么,但你仍然可能弄错。MySQL实际上会查看表内数据的分布以及查询本身,并可以做出不同的决定在不同的时间,随着数据的变化。