SQL实际上是如何在内存中运行的?一排

SQL实际上是如何在内存中运行的?一排,sql,sql-execution-plan,Sql,Sql Execution Plan,SQL实际上是如何运行的 例如,如果我想找到一行row\u id=123,SQL查询会从内存顶部逐行搜索吗?这是一个主题。简单地说,基于您的查询,数据库系统首先尝试生成并优化可能具有最佳性能的计划,然后执行该计划 对于像row_id=123这样的选择,实际查询计划取决于您是否有。如果没有,将使用表扫描逐行检查表。但是,如果您确实在行\u id上有一个索引,则可以使用该索引跳过大部分行。在这种情况下,DB不会逐行搜索 如果您正在运行PostgreSQL或MySQL,则可以使用 EXPLAIN SE

SQL实际上是如何运行的

例如,如果我想找到一行
row\u id=123
,SQL查询会从内存顶部逐行搜索吗?

这是一个主题。简单地说,基于您的查询,数据库系统首先尝试生成并优化可能具有最佳性能的计划,然后执行该计划

对于像
row_id=123
这样的选择,实际查询计划取决于您是否有。如果没有,将使用表扫描逐行检查表。但是,如果您确实在
行\u id
上有一个索引,则可以使用该索引跳过大部分行。在这种情况下,DB不会逐行搜索

如果您正在运行PostgreSQL或MySQL,则可以使用

EXPLAIN SELECT * FROM table WHERE row_id = 123;
查看系统生成的查询计划

作为示例表

CREATE TABLE test(row_id INT);          -- without index
COPY test FROM '/home/user/test.csv';   -- 40,000 rows
EXPLAIN SELECT*FROM test,其中row_id=123输出:

                  QUERY PLAN                      
------------------------------------------------------
 Seq Scan on test  (cost=0.00..677.00 rows=5 width=4)
    Filter: (row_id = 123)
 (2 rows)
这意味着数据库将对整个表进行顺序扫描,并找到
row_id=123
的行

但是,如果在列
行\u id=123上创建索引:

CREATE INDEX test_idx ON test(row_id);
然后,同样的
解释将告诉我们,数据库将使用索引扫描来避免遍历整个表:

                            QUERY PLAN                                
--------------------------------------------------------------------------
 Index Only Scan using test_idx on test  (cost=0.00..8.34 rows=5 width=4)
   Index Cond: (row_id = 123)
 (2 rows)
您还可以使用
EXPLAIN ANALYZE
查看SQL查询的实际性能。在我的机器上,顺序扫描和索引扫描的总运行时间分别为14.738 ms0.171 ms

有关查询优化的详细信息,请参阅中的第15章和第16章。

这是的主题。简单地说,基于您的查询,数据库系统首先尝试生成并优化可能具有最佳性能的计划,然后执行该计划

对于像
row_id=123
这样的选择,实际查询计划取决于您是否有。如果没有,将使用表扫描逐行检查表。但是,如果您确实在
行\u id
上有一个索引,则可以使用该索引跳过大部分行。在这种情况下,DB不会逐行搜索

如果您正在运行PostgreSQL或MySQL,则可以使用

EXPLAIN SELECT * FROM table WHERE row_id = 123;
查看系统生成的查询计划

作为示例表

CREATE TABLE test(row_id INT);          -- without index
COPY test FROM '/home/user/test.csv';   -- 40,000 rows
EXPLAIN SELECT*FROM test,其中row_id=123
输出:

                  QUERY PLAN                      
------------------------------------------------------
 Seq Scan on test  (cost=0.00..677.00 rows=5 width=4)
    Filter: (row_id = 123)
 (2 rows)
这意味着数据库将对整个表进行顺序扫描,并找到
row_id=123
的行

但是,如果在列
行\u id=123上创建索引:

CREATE INDEX test_idx ON test(row_id);
然后,同样的
解释将告诉我们,数据库将使用索引扫描来避免遍历整个表:

                            QUERY PLAN                                
--------------------------------------------------------------------------
 Index Only Scan using test_idx on test  (cost=0.00..8.34 rows=5 width=4)
   Index Cond: (row_id = 123)
 (2 rows)
您还可以使用
EXPLAIN ANALYZE
查看SQL查询的实际性能。在我的机器上,顺序扫描和索引扫描的总运行时间分别为14.738 ms0.171 ms


有关查询优化的详细信息,请参阅。

What RDBMS?什么是包含索引的表定义?什么是RDBMS?包含索引的表定义是什么?如果您有postgresql的
EXPLAIN
输出,您可以发布它以获得对其工作的一些分析。如果您有postgresql的
EXPLAIN
输出,您可以发布它以获得对其工作的一些分析。