SQL实际上是如何在内存中运行的?一排
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
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 ms和0.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 ms和0.171 ms
有关查询优化的详细信息,请参阅。What RDBMS?什么是包含索引的表定义?什么是RDBMS?包含索引的表定义是什么?如果您有postgresql的EXPLAIN
输出,您可以发布它以获得对其工作的一些分析。如果您有postgresql的EXPLAIN
输出,您可以发布它以获得对其工作的一些分析。