为啥有些值插入到mysql后会变为NULL-CSDN论坛
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥有些值插入到mysql后会变为NULL-CSDN论坛相关的知识,希望对你有一定的参考价值。
目前的版本无法禁止, 默认为null则返回null(表示空的),默认为not null则返回"",这是mysql的特点。 只能在客户端处理。 参考技术A 默认值。。。为啥使用参数化查询将数据插入表中比将值附加到查询字符串更快?
【中文标题】为啥使用参数化查询将数据插入表中比将值附加到查询字符串更快?【英文标题】:Why is using a parameterized query to insert data into a table faster than appending the values to the query string?为什么使用参数化查询将数据插入表中比将值附加到查询字符串更快? 【发布时间】:2010-12-23 12:52:41 【问题描述】:为什么要使用参数化查询向表中插入数据:
string queryString = "insert into product(id, name) values (@id, @name)";
比将值附加到查询字符串更快:
string queryString = "insert into product(id, name) values (" + _id + ", " + _name + ")";
?
当我在循环中使用该命令插入 10K 行时,参数化查询比另一个快一个数量级。
我知道参数化查询具有安全性和可维护性优势,并且是推荐的使用方式,但现在我想解释一下为什么它会快得多?
【问题讨论】:
不要质疑,但要享受,很少有任何事情最终变得更安全、更快捷! :) 您使用的是哪个数据库? 【参考方案1】:我敢打赌,如果您使用多个值,它不会更快 你最多可以做1000个
string queryString = "insert into product(id, name) values " +
" (" + _id + ", " + _name + ")" +
" , (" + _id1 + ", " + _name1 + ")" +
" , (" + _id2 + ", " + _name2 + ")";
【讨论】:
【参考方案2】:一般来说,执行 SQL 查询最昂贵的部分是构建执行计划 - 确定需要哪些表,确定要使用的最佳索引(如果有的话)等。您可以将其视为“如果你愿意,可以编译”查询。
当您使用参数化查询时,您可以准备一次,然后插入不同的目标值。由于是同一个操作,不同的数据,不需要每次都重新构建执行计划。为了扩展“编译”的比喻,这就像用不同的配置文件重新运行同一个程序。
但是,当您附加这些值时,您会将它们硬编码到查询中,因此每次都必须重新准备它,并且您会产生为每次迭代构建新执行计划的成本。再次使用“编译”比喻,这就像一个所有配置都硬编码的 C 程序 - 更改一个设置,您必须重新编译整个东西。
(进行批量插入时您可能遇到的另一个主要成本是更新索引。如果您的表被索引,您可能想尝试关闭它们,执行插入,然后重新打开它们,因此只需重新索引一次,而不是在添加每一行之后。)
【讨论】:
构建执行计划是仅在某些有限条件下执行 SQL 查询最昂贵的部分——绝对不是一般意义上的。 是否有关于这些条件限制程度的任何文档的链接?诚然,我只是重复我被告知的内容,因为这似乎是合理的,但从未尝试对运行查询的哪一部分需要更长的时间进行基准测试,因此我有兴趣了解实际事实。 (此外,OP 说他看到参数化版本的运行时间减少了一个数量级。这强烈表明,在这种情况下,准备查询 是操作中最昂贵的部分。)跨度> 查询运行需要一分钟或更长时间的情况并不少见;有些查询可能需要 24 小时以上。编译通常需要不到一秒钟的时间。当然,如果您编译的查询以毫秒为单位执行,那么编译可能会占总执行时间的很大一部分,但正如您的回答所暗示的那样,在一般情况下肯定不是这样。 啊,很公平。没错,我没有考虑过长时间运行的查询;谢谢你抓住那个。但另一方面,我的经验是,典型应用程序运行的绝大多数查询都在毫秒范围内(例如 OP 的简单 INSERT),这使得它们的性能特征“一般”是真实的(确实有与谈论“一般情况”有些不同的语义)。您如何看待从“一般”到“简单查询”的变化?这合理准确吗?或者我愿意接受其他措辞建议。【参考方案3】:简单。即使在查询执行开始之前,解析和准备查询的执行计划也需要大量时间。
当您将参数作为文本附加到查询时,每个查询都是不同的,因此DB需要对其进行解析并准备执行计划。
当您使用参数时,您会多次发送相同的查询(使用不同的数据),DB 可以简单地重用之前调用的执行计划。
在大多数情况下,这只是查询之间的文本比较。 例如,在 MS SQL Server 中,更改字母的大小写或在查询末尾添加空格以强制 DB 重新创建执行计划就足够了。
【讨论】:
【参考方案4】:根据您使用的数据库,通常的原因是参数化查询只需编译一次,而动态查询版本在每次使用时都会重新编译。
【讨论】:
在 Oracle 上从未出现过这种情况,SQL Server 终于支持缓存动态查询计划,自 v2005 起使用sp_executesql
:sommarskog.se/dynamic_sql.html#queryplans
SQL Server 中动态 SQL 的自动查询计划缓存仅适用于单个参数(自动参数化);超出此范围的差异被视为计划缓存键的一部分。【参考方案5】:
这是由于数据库缓存了查询计划,这使其速度更快。
Sql server 看这个解释
Execution Plan Caching and Reuse
【讨论】:
以上是关于为啥有些值插入到mysql后会变为NULL-CSDN论坛的主要内容,如果未能解决你的问题,请参考以下文章
Mysql5.1中,datetime类型的字段为啥插入不了NULL值