Mysql 投影中属性的顺序是否会影响SQL查询的执行速度?
假设我有一个表,其中列a、B、C、D、E、F、G、H、I按顺序排列,我只需要选择列a、C、F、I(可能是表有更多的列,我也必须检索更多的列) 我的问题是,如果我将要在投影中检索的列的顺序保持为按列索引号升序(例如a、C、F、I),而不是以完全随机的顺序(例如F、a、I、C)检索它们,那么(性能方面)会有什么不同吗。为什么 我知道顺序访问比随机访问快,但是我的示例中没有一个是顺序的,所以我不确定这两个投影顺序的性能差异是什么Mysql 投影中属性的顺序是否会影响SQL查询的执行速度?,mysql,sql-server,database,performance,projection,Mysql,Sql Server,Database,Performance,Projection,假设我有一个表,其中列a、B、C、D、E、F、G、H、I按顺序排列,我只需要选择列a、C、F、I(可能是表有更多的列,我也必须检索更多的列) 我的问题是,如果我将要在投影中检索的列的顺序保持为按列索引号升序(例如a、C、F、I),而不是以完全随机的顺序(例如F、a、I、C)检索它们,那么(性能方面)会有什么不同吗。为什么 我知道顺序访问比随机访问快,但是我的示例中没有一个是顺序的,所以我不确定这两个投影顺序的性能差异是什么 谢谢。在SELECT语句中选择a、B、C和SELEC B、a、C列的顺序
谢谢。在SELECT语句中选择a、B、C和SELEC B、a、C列的顺序完全相同。这是完全不相干的 如果你从一个有100列的巨大表格中只选择了3列,那么重要的是天气与否。如果在a、B、C列上有一个复合的非稀疏索引,数据库引擎可以使用它来避免执行整行读取 如果您在SELECT语句中引用的A、B、C列上提供索引,则可能。。。DB引擎可能会决定最好的做法是执行一个仅索引的计划,而不需要加载100列的单个DB行列中涉及的所有字节 尽管如此。 在FROM子句中声明表的顺序一点也不无关 您通常应该在FROM子句中命名表,从您认为有更多选择性谓词用于筛选数据的表开始,并通过这些谓词实现嵌套循环联接 我见过像HSQL这样的数据库,其数据库引擎优化未能使用我根据我在FROM子句中命名表的顺序创建的所有适当索引。 这取决于DB查询优化是如何实现的,以及它将探索多少查询执行计划。在FROM子句中以适当的顺序编写表将有助于您解决此问题 了解如何规划索引以优化查询 祝你好运。简短的回答:不 详细回答:这要看情况 在一般情况下,如果不知道您使用的是哪种产品,这个问题是不可能回答的 输出列的排序应该无关紧要 在大多数基于行的关系数据库(包括Microsoft、PostgreSQL和Oracle)中,输出列的顺序没有明显的区别。这是因为行数据是按块从内存中读取的(例如,在8kB或32kB的块中)。读入内存后,处理成本相当低 输出列的数量会有所不同,尤其是在使用列式(基于列的)存储构建的数据库中。对于基于行的存储,这也很重要(因为内存中的处理成本和数据传输成本) 请指定您是否考虑使用特定的数据库引擎 我的问题是,如果我将要在投影中检索的列的顺序保持为按列索引号升序(例如a、C、F、I),而不是以完全随机的顺序(例如F、a、I、C)检索它们,那么(性能方面)会有什么不同吗。为什么 可能,但这不太可能是重大的,而且会因实施情况而有所不同。MySQL和SQL Server可能很容易得到完全不同的答案 例如,我对SQL Server的理解是,它以称为页面的固定块读取磁盘,页面大小为8KB。除了LOB的一些例外情况外,单个行不允许跨越多个页面,这会造成8060字节的限制。如果您的数据将超过这个值,并且您没有使用LOB,那么实际上您必须创建另一个表。所以,不管您做什么,当SQL Server从表中读取记录时,它读取的是整个页面,因此也是整个记录 现在,有很多事情可以改变发生的事情。覆盖所有列、稀疏列、LOB等的索引将显著改变数据在表中的存储和访问方式。但这一切都不会受到你的订购方式的影响。查询引擎的部分工作是确定从磁盘检索数据的最有效方式 底线:I/O的成本将比内存中这些列的排序高出几个数量级。除了一个可能的人为的例子之外,我想不出有什么原因可以作为编写查询的考虑因素