DBMS(MySQL、SQL Server…;)是解释的还是编译的?

DBMS(MySQL、SQL Server…;)是解释的还是编译的?,mysql,database,Mysql,Database,我的意思是,就SQL查询而言,它们是在低级别上编译或解释的吗?。它是如何在内部工作的,它是一个解释或编译的SQL语句?它通常是这样工作的: SQL String ---[Optimizer]---> Execution Plan ---[Execution]---> Result SQL字符串--[Optimizer]-->执行计划--[Execution]-->结果 我个人喜欢将优化器(查询计划器)视为非常类似于编译器的东西。它将SQL语句转换为更容易执行的语句。然而,它不是可在芯片上执行的。

我的意思是,就SQL查询而言,它们是在低级别上编译或解释的吗?。它是如何在内部工作的,它是一个解释或编译的SQL语句?

它通常是这样工作的:

SQL String ---[Optimizer]---> Execution Plan ---[Execution]---> Result SQL字符串--[Optimizer]-->执行计划--[Execution]-->结果 我个人喜欢将优化器(查询计划器)视为非常类似于编译器的东西。它将SQL语句转换为更容易执行的语句。然而,它不是可在芯片上执行的。这个“编译”相当昂贵——就像编译C++代码一样。这是评估不同执行变量的部分;连接顺序、要使用的索引等。最好尽可能使用绑定参数来避免这种情况

然后执行计划由数据库执行。然而,这一战略已经确定。执行就是这么做。这部分解释的是执行计划,而不是SQL

毕竟,它在某种程度上类似于Java或.NET,在Java或.NET中,编译将源代码转换为二进制形式,可以更容易地进行解释。如果我们忽略这个参数的JIT,Java程序的执行就是解释这个元代码



我用这种方式解释了my中的好处。

在现代SQL环境中,这是一种分阶段的方法,您可以在工作流的某个级别上决定是否要重新使用现有的编译块或重新启动所有阶段(如果您对某个参数组合有更好的计划)

我认为这是(重新)编译时间和(然后编译为可执行代码)结果执行时间之间的一种回报。根据查询的复杂性,如果由于可预见的最小资源消耗(例如,读取两行并返回),现有代码的执行时间已经很低,则在运行时应用给定参数的细节的重新编译可能不值得

随着查询复杂度的提高和资源消耗的估计(涉及到许多巨大的表、关键的索引选择、可能的表扫描),统计数据的粒度将发挥作用。i、 例如,如果您有选择性、离群值、范围选择性、平均字段大小、物理地图大小等,优化器可能会使用不同的参数集得出非常不同的结论

为具有10++变量参数的25 join语句计算最佳计划可能需要花费时间和资源。如果结果比“一对所有”版本更快、更高效,那么值得付出努力。特别是当给定的参数集可能包含游戏规则改变者时,查询将频繁地重新执行


最后,您的里程数可能因供应商而异;)

您是专门询问MySQL还是任何DBMS?因为不同的DBMS在编译和解释频谱上处于不同的位置,如果我错了,请纠正我:您可能想补充一点,优化器可以对执行计划使用缓存,这将解释绑定参数的优势。