MySql Delete 使用及优化

一、概述

DELETE是一个DML语句,用于从表中删除行。
DELETE语句可以从with子句开始,以定义DELETE中可访问的公用表表达式。

单表语法

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias][PARTITION (partition_name [, partition_name] ...)][WHERE where_condition][ORDER BY ...][LIMIT row_count]

DELETE语句从tbl_name中删除行,并返回已删除的行数。要检查已删除的行数,请调用ROW_COUNT()函数。

二、主要条款

可选WHERE子句中的条件标识要删除的行。如果没有WHERE子句,则会删除所有行。
其中_condition是一个表达式,对于要删除的每一行,该表达式的计算结果都为true。
如果指定了ORDER BY子句,则按指定的顺序删除行。LIMIT子句限制了可以删除的行数。这些子句适用于单表删除,但不适用于多表删除。

多表语法

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]tbl_name[.*] [, tbl_name[.*]] ...FROM table_references[WHERE where_condition]DELETE [LOW_PRIORITY] [QUICK] [IGNORE]FROM tbl_name[.*] [, tbl_name[.*]] ...USING table_references[WHERE where_condition]

特权
您需要对表具有DELETE权限才能从表中删除行。您只需要对任何只读取的列(如WHERE子句中命名的列)具有SELECT权限。

性能
当您不需要知道删除的行数时,TRUNCATE TABLE语句是比不带WHERE子句的DELETE语句更快清空表的方法。与DELETE不同,TRUNCATE TABLE不能在事务中使用,也不能在表上有锁的情况下使用。

为了确保给定的DELETE语句不会花费太多时间,DELETE的MySQL特定的LIMIT row_count子句指定了要删除的最大行数。如果要删除的行数大于限制,请重复delete语句,直到受影响的行数小于limit值。

子查询
不能从表中删除,也不能在子查询中从同一表中选择。

分区表支持
      DELETE支持使用partition子句进行显式分区选择,该子句采用一个或多个分区或子分区(或两者)的逗号分隔名称列表,从中选择要删除的行。未包含在列表中的分区将被忽略。给定分区为p0的分区表t,执行语句DELETE FROM t partition(p0)对该表的影响与执行ALTER table t TRUNCATE partition (p0);在这两种情况下,分区p0中的所有行都被删除。
       PARTITION可以与WHERE条件一起使用,在这种情况下,只在列出的分区中的行上测试条件。例如,DELETE FROM t PARTITION(p0)WHERE c<5仅从条件c<5为true的分区p0中删除行;不检查任何其他分区中的行,因此不受DELETE的影响。
       PARTITION子句也可以用于多个表DELETE语句中。每个在FROM选项中命名的表最多可以使用一个这样的选项。

自动递增列
如果删除包含AUTO_INCREMENT列最大值的行,则MyISAM或InnoDB表不会重用该值。如果在自动提交模式下使用delete FROM tbl_name(不带WHERE子句)删除表中的所有行,则除InnoDB和MyISAM外,所有存储引擎的顺序都将重新开始。InnoDB表的这种行为有一些例外。

对于MyISAM表,可以在多列键中指定AUTO_INCREMENT辅助列。在这种情况下,即使对于MyISAM表,也会重复使用从序列顶部删除的值。

修饰符
DELETE语句支持以下修饰符:

  • 如果指定LOW_PRIORITY修饰符,则服务器会延迟DELETE的执行,直到没有其他客户端从表中读取为止。这只会影响仅使用表级锁定的存储引擎(如MyISAM、MEMORY和MERGE)。
  • 对于MyISAM表,如果使用QUICK修饰符,存储引擎在删除期间不会合并索引叶,这可能会加快某些类型的删除操作。
  • IGNORE修饰符导致MySQL在删除行的过程中忽略可忽略的错误。(解析阶段遇到的错误以通常的方式处理。)由于使用IGNORE而被忽略的错误将作为警告返回。有关详细信息

删除顺序
如果DELETE语句包含ORDER BY子句,则按该子句指定的顺序删除行。这主要与LIMIT一起使用。例如,以下语句查找与WHERE子句匹配的行,按时间戳_列对它们进行排序,并删除第一个(最旧的)行: 

DELETE FROM somelog WHERE user = 'jcole'
ORDER BY timestamp_column LIMIT 1;

ORDERBY还有助于按照避免引用完整性冲突所需的顺序删除行。

三、InnoDB 表

如果要从一个大表中删除许多行,则可能会超过InnoDB表的锁表大小。为了避免这个问题,或者只是为了尽量减少表保持锁定的时间,以下策略(根本不使用DELETE)可能会有所帮助:

  • 在与原始表具有相同结构的空表中选择不删除的行:
INSERT INTO t_copy SELECT * FROM t WHERE ... ;
  • 使用RENAME TABLE自动移动原始表,并将副本重命名为原始名称:
RENAME TABLE t TO t_old, t_copy TO t;
  • 删除原始表格:
    DROP TABLE t_old;
    

    当RENAME TABLE执行时,没有其他会话可以访问所涉及的表,因此重命名操作不会出现并发问题。

四、多表删除

根据WHERE子句中的条件,可以在DELETE语句中指定多个表来删除一个或多个表中的行。不能在多表DELETE中使用ORDER BY或LIMIT。
对于第一个多表语法,只删除from子句之前列出的表中的匹配行。对于第二个多表语法,只删除from子句(在USING子句之前)中列出的表中的匹配行。其效果是,您可以同时从多个表中删除行,并具有仅用于搜索的其他表:

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

这些语句在搜索要删除的行时使用所有三个表,但仅从表t1和t2中删除匹配的行。
前面的示例使用INNER JOIN,但是多个表DELETE语句可以使用SELECT语句中允许的其他类型的联接,例如LEFT JOIN。例如,要删除t1中存在但t2中没有匹配项的行,请使用LEFT JOIN:

DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;

语法允许在每个tbl_name后面加.*,以与Access兼容。
如果使用涉及存在外键约束的InnoDB表的多表DELETE语句,MySQL优化器可能会以不同于其父/子关系的顺序处理表。在这种情况下,语句将失败并回滚。相反,您应该从单个表中删除,并依靠InnoDB提供的on delete功能来相应地修改其他表。

多表DELETE中的表别名只能在语句的Table_references部分声明。在其他地方,允许使用别名引用,但不允许使用别名声明。
正确:

DELETE a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2
WHERE a1.id=a2.id;DELETE FROM a1, a2 USING t1 AS a1 INNER JOIN t2 AS a2
WHERE a1.id=a2.id;

不正确的

DELETE t1 AS a1, t2 AS a2 FROM t1 INNER JOIN t2
WHERE a1.id=a2.id;DELETE FROM t1 AS a1, t2 AS a2 USING t1 INNER JOIN t2
WHERE a1.id=a2.id;

从MySQL 8.0.16开始的单表DELETE语句也支持表别名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/62482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Git游戏】远程分支

origin/<branch> 远程分支在本地以 origin/<branch>格式存在&#xff0c;他指向上次和远程分支通过时的记录 git checkout origin/<branch> 会出现HEAD分离的情况 与远程通讯 git fetch —— 从远端获取数据&#xff08;实际上将本地仓库中的远程分支更新…

mysql 内置函数

目录 日期函数 current_date current_time current_timestamp date now date_add date_sub datediff 字符串函数 charset concat instr ucase lcase left length replace strcmp substring ltrim/rtrim/trim ltrim rtrim trim 数学函数 abs bin hex …

ES线程池设置

一文搞懂ES中的线程池 - 知乎 ES线程池设置-阿里云开发者社区 文章目录 一、简介 二、线程池类型 2.1、fixed 2.2、scaling 2.3、direct 2.4、fixed_auto_queue_size 三、处理器设置 四、查看线程池 4.1、cat thread pool 4.2、nodes info 4.3、nodes stats 4.4、no…

前端网络相关的面试题

get和post经过几次tcp连接? HTTP的GET和POST请求都是基于TCP协议的&#xff0c;因此在发送请求之前都需要建立TCP连接。TCP连接的建立通常被称为三次握手&#xff08;Three-way Handshake&#xff09;。 第一次握手&#xff1a;客户端发送一个SYN包&#xff08;同步序列编号…

【python爬虫】8.温故而知新

文章目录 前言回顾前路代码实现体验代码功能拆解获取数据解析提取数据存储数据 程序实现与总结 前言 Hello又见面了&#xff01;上一关我们学习了爬虫数据的存储&#xff0c;并成功将QQ音乐周杰伦歌曲信息的数据存储进了csv文件和excel文件。 学到这里&#xff0c;说明你已经…

nvm集合node版本,解决新版本jeecgboot3.5.3前端启动失败问题

jeecgboot前端3.5.3页面如下 使用之前的pnpm启动会报错&#xff0c;pnpm是node进行安装的&#xff0c;查询后发现&#xff0c;vue3版本的页面至少需要node16版本&#xff0c;我之前的版本只有15.5&#xff0c;适用于vue2 那么我将先前的node15.5版本删除&#xff0c;然后安装…

【Hadoop】DataNode 详解

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

Redis——》实现分布式锁

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

【解决】idea启动spring MVC报错:一个或多个listeners启动失败Listener ClassNotFoundException

idea配置教程。tomcat调试报错Artifact :war exploded: Error during artifact deployment。 修改代码后&#xff0c;启动不生效&#xff0c;仍是旧代码。 根本原因是&#xff1a; Modules output path和Artifacts output directory不匹配 Modules output path一定要等于Ar…

网络编程 day 5

1、根据select TCP服务器流程图编写服务器 #include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)#define PORT 8888 //端口号&#xff0c;范围1024~49151 #define IP "192.168.…

Uniapp中vuex的使用

vuex的学习笔记&#xff0c;很多地方还都不是很懂&#xff0c;先记下来再说&#xff0c;比小程序里自带的store复杂很多&#xff0c;看着头大&#xff0c;而且方法里面很多ES6的内容&#xff0c;头都看到爆炸 一、初始化vuex 新建store.js&#xff0c;挂载到main.js 1、在根…

Flink SQL你用了吗?

分析&回答 Flink 1.1.0&#xff1a;第一次引入 SQL 模块&#xff0c;并且提供 TableAPI&#xff0c;当然&#xff0c;这时候的功能还非常有限。Flink 1.3.0&#xff1a;在 Streaming SQL 上支持了 Retractions&#xff0c;显著提高了 Streaming SQL 的易用性&#xff0c;使…

前端性能优化

前言 性能优化这个问题&#xff0c;在面试的过程中问道的概率还挺大的&#xff0c;特别是对有前端开发经验的面试者来说&#xff0c;基本会被面试官问道关于性能优化的问题。但是在我们做项目的过程中&#xff0c;可能业务比较简单&#xff0c;并没有复杂到需要专门去优化的程…

c#接口(interface)

概述&#xff1a; 在C#中&#xff0c;接口是一种定义了一组相关方法、属性和事件的规范。接口可以被类或结构体实现&#xff0c;以提供一种方式来定义类之间的契约或协议。 接口定义了一组成员&#xff0c;这些成员没有具体的实现。实现接口的类必须提供这些成员的具体实现。…

linuxdeploy安装CentOS7搭建django服务

目录 一、busybox安装 二、linuxdeploy安装 三、linuxdeploy软件设置及安装 四、CentOS基础环境配置 五、CentOS7 上安装Python3.8.10 六、systemctl的替代品 七、CentOS7 上安装mysql5.2.27数据库 八、CentOS7 上安装Nginx服务 九、Django项目应用部署 参考文献: 一…

《Python入门到精通》webbrowser模块详解,Python webbrowser标准库,Python浏览器控制工具

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 webbrowser模块详解 1、常用操作2、函数大全webbrowser.open() 打开浏览器webbro…

线程同步与互斥

目录 前言&#xff1a;基于多线程不安全并行抢票 一、线程互斥锁 mutex 1.1 加锁解锁处理多线程并发 1.2 如何看待锁 1.3 如何理解加锁解锁的本质 1.4 CRAII方格设计封装锁 前言&#xff1a;基于线程安全的不合理竞争资源 二、线程同步 1.1 线程同步处理抢票 1.2 如何…

Python爬虫(十七)_糗事百科案例

糗事百科实例 爬取糗事百科段子&#xff0c;假设页面的URL是: http://www.qiushibaike.com/8hr/page/1 要求&#xff1a; 使用requests获取页面信息&#xff0c;用XPath/re做数据提取获取每个帖子里的用户头像连接、用户姓名、段子内容、点赞次数和评论次数保存到json文件内…

实现不同局域网文件共享的解决方案:使用Python自带HTTP服务和端口映射

文章目录 1. 前言2. 本地文件服务器搭建2.1 python的安装和设置2.2 cpolar的安装和注册 3. 本地文件服务器的发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有广泛的应用…

2023.8.26-2023.9.3 周报【3D+GAN+Diffusion基础知识+训练测试】

目录 学习目标 学习内容 学习时间 学习产出 学习目标 1. 3D方向的基础知识 2. 图像生成的基础知识&#xff08;GAN \ Diffusion&#xff09; 3. 训练测试GAN和Diffusion 学习内容 1. 斯坦福cv课程-3D &#xff08;网课含PPT&#xff09; 2. sjtu生成模型课件 3. ge…