
删除和更新操作的成本通常高于插入操作的成本,因此,一个好的设计需要减少对的更新和删除操作.
3.1更新操作
更新操作将带来一系列“影响”: 更新操作需要记录日志(以便在发生错误时可以回滚);更新可变长度字段(例如varchar类型)将带来数据物理存储的变化(记录Mobile);更新索引字段将导致重建索引;更新主键将导致数据重组等. 所有这些不仅会导致更新操作本身的效率低下,而且还会由于生成磁盘碎片而降低查询的性能. 为了应对这种情况,有两种策略: 第一,减少更新数量,在同一条语句中写入多个字段更新;其次,避免更新. 这两种策略适用于不同的情况,下面将以这两种情况为例.
3.1.1减少更新数量
集成库中有一个代码清理过程,该过程通过连接代码表为业务数据的自编码字段分配值. 代码清理实际上是通过关联代码表来更新业务数据表的过程. 需要连接多个代码表以更新多个自编码字段. 要完成此更新,有两种写更新语句的方法: 一种是写多个SQL语句,每个语句更新一个自编码字段. 另一种是将所有更新写在一个语句中. 用于更新银行代码的更新语句如下:
updateTBL_INCOME_TMP A setBANKCODESELF = ( select SELFCODE from TBL_BANKINFO B where A.BANKCODE = B.BANKCODE )
通过一条update语句更新多个自编码字段的语句如下:
代码如下:
updateTBL_INCOME_TMP
设置代码1自编码=通过相关的代码1表获得自编码,
代码2自编码=通过相关的代码2表获得自编码,
...,
代码n自编码=通过关联代码n表获得自编码
使用2000万个测试数据. 下表列出了这两种方法的测试结果. 从测试结果可以看出,一次性更新方法的性能提高了十倍,大大提高了性能.
处理过程
多种更新方法需要时间

一种更新方法需要时间
代码清除
0:29:48
0:02:59
3.1.2避免更新
这是一个受欢迎的示例,经常会遇到这种情况. 公司有员工考勤系统. 为了提高查询统计的性能,已在原始系统的基础上建立了一些包含冗余信息的表. 以员工表为例,获取数据的过程如图12所示. 第一步是将员工信息放入新表中,然后通过“部门ID”字段进行连接以更新“部门名称”. 连接.
图12.关联更新
通常,为了节省存储费用,部门名称等字段被设计为可变长度. 因此,更新时将导致磁盘数据的重组,形成磁盘碎片并影响查询性能.
为了避免这种情况,我们可以使用图13所示的方法来避免更新. 此方法只需一步就可以完成冗余数据表的插入,然后连接到部门表以获取“部门名称”,从而避免了更新操作.
图13.避免更新
3.2删除操作
初学者可能会认为删除操作非常简单,可以很快完成. 实际上update 性能,这是错误的理解. 删除过程需要大量的磁盘扫描. 需要记录日志;并且删除过程不会释放磁盘空间,浪费磁盘并碎片化磁盘上的数据,这对后续查询的性能是致命的打击. 通常有两种处理方法: 首先,重新组织经常删除的表(重组);其次,避免删除.
3.2.1重组
重组(reorg)操作将重新排列列表数据的物理顺序,并删除碎片数据中的可用空间.
由于删除操作不会释放磁盘空间,因此在执行删除操作后,表将变得碎片化,从而导致严重的性能下降,在多次更新操作之后也会出现这种情况. 如果收集了统计信息,但看不到明显的性能改善,则重组表数据可能会有所帮助. 重新组织表数据时,请根据指定的索引重新排列数据的物理顺序,并删除碎片数据中的可用空间. 这样可以更快地访问数据,从而提高性能.
3.2.2避免删除中间表和正式表模式

当数据需要更复杂的处理时,通常使用中间表和形式表. 在中间表中处理数据,然后将满足条件的数据转移到形式表中,将不满足条件的数据保留在中间表中. 图14说明了将数据从中间表转移到形式表的过程: 完成数据处理后,需要将中间表temp1中标志= 1的数据插入形式表中,并将标志=中间表temp1中的1需要删除.
图14.将数据从中间表转移到正式表
因为flag字段不是聚集索引,所以删除中间表temp1时,磁盘上会留有很多碎片,如图15所示. 删除的数据空间将不会自动释放. 结果不仅浪费磁盘空间,而且查询性能将大大下降.
图15.删除操作后磁盘碎片
我们可以使用命令清除表,以避免删除操作. 除了中间表temp1和形式表之外,还添加了一个辅助临时表temp2. 如果在temp1中保留的数据= 0仅占10%,则此优化将显着提高性能. 具体步骤如下:
1. 将temp1中flag = 0的数据插入temp2
2. 空表temp1
代码如下:
更改表temp1最初没有与空表一起记录;
3. 将temp2中的数据插入temp1
3.3如何提高访问效率
本节的大部分内容来自《 SQL的艺术》一书,该书收集了开发的一般经验. 尽管不限于特定的DBMS和硬件平台,但它是一本非常实用的书.
1. 一次连接到并执行许多操作. 在该过程完成之前,连接不会断开.
2. SQL语句包含尽可能多的操作. 从视觉上讲: 在光标的帮助下,成千上万的句子不断循环,这非常慢. 更改为几个句子并处理相同的数据仍然非常缓慢. 最好改成句子来解决问题.
3. 靠近DBMS核心. 尝试使用随附的功能. 减少自定义功能. 因为即使是聪明的优化器也无法识别自定义功能.
4. 不要在一条语句中连接太多表. 建议的上限为5.

5. 集中更新频繁更新的列: 当更新一行时,DB2记录所有已更改的列,因此将频繁更新的列放在一起可以减少DB2的记录工作. 这只是有关性能的一个小建议,因此,不应对主要应用程序或设计进行更改即可实现.
以上是本文的所有内容,希望MySql的删除和更新是否会对性能产生影响.
时间: 2015-08-04
在MySQL中,InnoDB引擎类型的表支持外键约束. 使用外键的条件: 1.两个表都必须是InnoDB表,MyISAM表暂时不支持外键(据说将来的版本可能会支持,但至少当前不支持): 2.外键列必须是建立索引后,MySQL 4.1.2和更高版本将在创建外键时自动创建索引,但是如果您需要在较早版本中显示建立,则: 3.外键关系中两个表的列在数据类型上必须相似,也就是说,可以在彼此之间转换类型的列(例如int和tinyint,但是int和char则不是): 外键的好处: 您可以使两个表相关update 性能,保证数据一致性并实现一些级联操作
1. 创建主键语法ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(列名); 2.创建外键语法ALTER TABLE news_info [子表名] ADD CONSTRAINT FK_news_info_news_type [约束名] FOREIGN KEY(info_id)[子表列]参考news_type [主表名](id)[主表列]; 3.使用组合的主键. 如果一列不能唯一区分表中的记录,则可以考虑多个

以下是如何插入Mysql学习经验的详细图片. 更新. 删除记录. 插入记录复制代码代码如下: 将[]插入到tb1_name [(col_name,-..)]自动编号的字段中,您可以使用值default默认值来分配默认值来复制代码代码如下所示: INSERT USERS VALUES(NULL,'TOM','123',25,1);您可以同时插入多个记录,复制代码如下: INSERT用户值(DEFAULT,“ TOM”,“ 123

类似地,它将仅说明SQLSERVER和插入之间的区别. 将多行查询结果插入表中. 语法INSERT INTO table_name1(column_list1)SELECT(column_list2)FROM table_name2 WHERE(条件)SQLSERVER还支持INSERT INTO SELECT table_name1指定要插入的数据表: column_list1指定要插入表中数据的哪些列已插入: table_name2指定要从中查询插入数据的表
每个使用MySQL开发驱动的小型Web应用程序的人都知道,在关系中创建,检索,更新和删除表是相对简单的过程. 从理论上讲,只要您掌握了最常用的SQL语句,并且熟悉您选择使用的服务器端脚本语言,就足以应付MySQL表所需的各种操作,尤其是当您使用快速的MyISAM引擎. 但是,即使是最简单的事物,事情也比我们想象的要复杂得多. 下面我们用一个典型的例子来说明. 假设您正在运行一个博客网站,几乎每天都在更新,并且该网站允许访问者评论您的帖子. MySQL外键约束
直接在mysql中做出此判断的方法是使用row_count(),此语句应立即跟随您执行的sql语句. Node.js的I / O是异步的,因此这就产生了一个问题,根本无法判断SQL执行结果的哪一行row_count(). 大致浏览了该文档,该文档没有描述问题. 我想嵌套该函数以实现同步效果,但我无意查找相应的SQL执行. 异步函数的参数中有一个受影响的行字段. 经过测试,该乘积是row_count()的结果. 示例: 复制代码,如下所示: var cmd
本文中的示例描述了MySQL如何使用外键来实现级联的删除和更新. 我与您分享供您参考. 具体如下: MySQL仅支持InnoDB作为支持外键的存储引擎. 创建外键时,需要父表. 必须有一个对应的索引,并且子表在创建外键时将自动创建对应的索引. 创建索引时,可以指定删除. 更新父表时,对子表的相应操作包括RESTRICT.NO ACTION.SET NULL和CASCADE. 其中,RESTRICT和NO ACTION相同,这意味着在子表具有关联记录时不能更新父表: CASCADE表示在更新或删除父表时对其进行更新
本文中的示例描述了php + mysqli实现批量插入,更新和删除数据的方法. 与您分享以供参考. 详细信息如下: mysqli批处理插入/更新/删除数据,函数为multi_query(). 以下代码仅用于批量插入数据. 实际上,插入数据,更新数据,删除数据等可以混合并一起执行. 查询时使用此功能,读取数据有些不同,具体参考如下: Php // 1.创建连接对象$ mysqli = new MySQLi(“ localhost”,“ root”,“
最近,我开始制作一个实验室管理系统,因为它被分为几个表进行存储. 因此,有必要保持表之间的关系. *研究MySQL的外键. (1)只能使用InnoDB类型表. 外键,mysql默认为MyISAM. 此类型不支持外键约束. (2)外键的好处: 您可以关联两个表,确保数据一致性,并执行一些级联操作: (3)外键的作用: 维护数据的一致性和完整性. 主要目的是控制存储在外键表中的数据. 为了使两个表形成关联,外键只能引用外表中的列的值! (4)建立外键的前提: 两个每个表必须是InnoDB表类型. 必须请求外键关系中使用的字段
无法创建这样的.frm文件的错误似乎暗示操作系统文件权限错误或其他原因,但实际上,这些都不是正确的. 实际上,此mysql错误已被报告为mysql本身. 该错误已出现在mysql开发人员列表中多年,但这似乎具有误导性. 在许多情况下,由于没有很好地支持mysql之间的关系而发生这种错误. 更不幸的是,它没有指定哪个问题会导致上述错误. 下面我列出了造成此150错误的常见原因,并按问题的可能性对它们进行了分类. 原因: 1.两个字
mysql创建外键

建立外键的前提: 该表的列必须与外键具有相同的类型(外键必须是外表的主键). 外键的作用: 要关联两个表,外键只能引用外表中的列的值!指定主键关键字: Foreignkey(列名)引用外键关键字: 引用<外键表名>(外键列名)事件触发限制: ondelete和onupdate,可以设置级联参数(跟随外键更改),限制(限制外部表中的外键更改),setNull(设置null值),setDefault(设置默认值),[默认] noaction例如: outTa
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-222104-1.html
风险大小
恬不知耻