Jeff Atwood wrote once他找到了主键的查询数据库,然后使用IN子句获取所有相关字段的速度是单sql副本的两倍。
我想知道这是否适用于所有情况,如果没有,那么它在性能方面仍有很大改进空间的情况是什么?
此外,通过脚本语言库访问数据库有多昂贵?我主要谈论着名的PHP-MySQL组合。
答案 0 :(得分:3)
这取决于。有时候,正如Jeff的博客文章明确指出的那样,它可以提供(显着)性能提升。但作为一般规则,最好让查询优化器找到最佳的执行计划,然后尝试手动优化特别慢的查询。
从文章“我们默认使用内置的Linq语言结构,然后下拉到手动调优SQL blob,性能痕迹告诉我们需要它们。”同样,您应该默认使用查询优化器执行它所做的操作,然后下拉手动调整性能跟踪告诉您需要的SQL语句。
从脚本语言连接到数据库引擎通常非常快。通常,实际执行查询所需的时间远远长于实际连接到数据库服务器并将结果从数据库服务器移回请求脚本。
答案 1 :(得分:2)
Jeff Atwood谈论的是SQL Server,而不是MySQL。众所周知,SQL优化依赖于DBMS,配置,查询,数据和缓存状态。除了说选择主键字段至少与选择整行一样快之外,很难概括。当然,很难概括到任何有用的程度。你必须对你的具体案例进行基准测试。
根据我对MySQL的经验,如果选择IN查询的详细信息比首先执行SELECT *
更快,我会感到惊讶。我的理解是SELECT *
比SELECT id
更昂贵,因为MySQL必须在两种情况下查找索引数据,但在前一种情况下必须执行额外的步骤来获取构成其余部分的数据该行可能需要进一步的磁盘搜索(特别是因为表数据不太可能在缓存中而不是索引)。但是,使用InnoDB聚簇索引(如果您使用InnoDB时将使用主键),则会有一种特殊情况,即数据与聚簇索引中的索引条目一起存储。在这种情况下,我相信SELECT *
的速度几乎与SELECT id
相同。
答案 2 :(得分:0)
从表中获取数据时,通过密钥检索数据总是会更快。这就是数据库的工作方式;抓取索引数据比抓取非索引数据更快。并且仅密钥可以更快,因为所有数据库引擎必须做的是将索引中的数据“展开”到结果集中。
至于你的“昂贵”问题,我假设你的意思是“它很慢”。我没有发现情况如此。从计算的角度来看,最昂贵的一个,查询的一部分是打开连接,大多数(如果不是全部)现代数据库使用某种形式的连接缓存,所以它不再那么昂贵。至于查询本身,唯一真正的开销是网络延迟,因此您应该看到查询需要大约相同的时间或不长于您从非脚本语言查询的时间(换句话说,毫秒)。