mysql 只能删一行_防止用户在MySQL中删除超过一定数量的行

问题:

>我有一个有行的表,没什么特别的

>当数据库用户删除行时,它应该递增一个数字

>数据库用户只允许在表中删除最多3行

>数据库管理员应该能够向数据库用户添加更多“删除令牌”

我知道我应该有一个BEFORE DELETE触发器来查看用户是否可以删除一行,还有一个AFTER DELETE触发器来增加用户删除的行数.

我应该如何存储有关数据库用户从该特定表中删除了多少行的信息,以及如何允许数据库管理员向用户添加更多“删除令牌”.

我想创建一个表来存储它,但是我想知道在没有表的情况下是否有不同的方法可以做到这一点?这可能听起来像一个奇怪的问题,但我只想弄清楚更先进的东西是如何工作的.

解决方法:

有了这种粒度,您需要进行相当精细的设置.

我在考虑建议几件事

建议#1:使用专门DML的存储过程

必须对每个用户的DELETE数量进行微观管理以减轻DML,这不应成为针对特定表的DELETE的以服务器为中心的功能.这应该仍然是以应用程序为中心的功能.因此,创建一个可以管理DELETE数量的存储过程.

建议#2:使用BLACKHOLE存储引擎

任何使用真实表的DELETE的审计跟踪都可能会产生一个本地化的磁盘瓶颈,这对于节流来说有点笨拙.如果审计跟踪记录在BLACKHOLE表中,那么这将显着减少任何磁盘I / O问题,否则会导致其丑陋.如果您写入BLACKHOLE表,那么审计跟踪数据将写入何处?这导致……

建议#3:使用MySQL复制

MySQL Replication如何提供帮助?假设该表名为mydb.audittrail.如果mydb.audittrail在Prod服务器上使用BLACKHOLE,它可以复制到具有mydb.audittrail作为MyISAM的Slave.那将是实际审计数据的位置.唯一的缺点是添加了磁盘I / O,用于将审计跟踪信息写入二进制日志.您可以通过将二进制日志存储在SSD或RAM磁盘上来进一步减少这种情况.

有关使用BLACKHOLE存储引擎和MySQL Replication进行审计跟踪记录概念的更多信息,请参阅我对Is it normal to use many Triggers?的回答.

标签:mysql,trigger

来源: https://codeday.me/bug/20190806/1595094.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下语句快速删除MySQL数据库的一千万数据: DELETE FROM table_name LIMIT 10000000; 请确保在运此语句之前备份数据。此外,由于该操作可能需要一些时间才能完成,请在终端或命令提示符窗口此语句,以便在操作完成后获得提示。 ### 回答2: 要快速删除一千万数据,可以采取以下方法: 1. 使用TRUNCATE TABLE命令:相对于使用DELETE语句逐删除数据,TRUNCATE TABLE命令可以更快地删除整个的数据。它直接释放所占用的磁盘空间,而不是逐删除数据,从而提高删除速度。 2. 关闭MySQL的主键和外键检查:在删除大量数据时,关闭主键和外键检查可以显著提高删除速度。可以使用以下语句暂时关闭主键和外键检查: ALTER TABLE table_name DISABLE KEYS; SET FOREIGN_KEY_CHECKS = 0; 删除完成后,记得重新启用主键和外键检查: ALTER TABLE table_name ENABLE KEYS; SET FOREIGN_KEY_CHECKS = 1; 3. 优化删除语句:使用DELETE语句删除数据时,可以通过以下优化来提高删除速度: - 使用带索引的WHERE子句:在DELETE语句,使用带索引的WHERE子句可以加速数据查找和删除。 - 使用LIMIT子句:使用LIMIT子句将删除操作分为多个批次进,每个批次删除一定数量的数据,避免一次性删除过多数据导致性能下降。 - 使用条件限制范围:根据数据的特点,可以先使用SELECT语句查询出需要删除的数据的范围,然后在DELETE语句使用这个范围作为条件进删除。 4. 使用分区:如果数据较大且已分区,可以通过删除整个分区来快速删除数据。这种方法可以避免一行一行删除数据的开销。 以上是一些常用的方法来快速删除大量数据,具体的选择和实施方法可以根据实际情况来决定。 ### 回答3: 要快速删除MySQL的一千万数据,可以采取以下方法: 1. 使用TRUNCATE命令:TRUNCATE是一种快速删除数据的方法,它不仅删除数据,还重置的自增计数。在执之前,确保已将和数据备份。使用以下SQL语句:TRUNCATE TABLE 名; 2. 使用DELETE命令:DELETE命令将逐删除指定条件的数据,但相比TRUNCATE,删除速度较慢。为了提高效率,可以按照合适的条件选择删除的范围,避免全扫描。使用以下SQL语句:DELETE FROM 名 WHERE 条件; 3. 分批次删除:将一千万数据分为多个子集,并通过循环的方式逐个删除子集,以减轻数据库的负担。例如,可以通过使用LIMIT和OFFSET来限制每次删除的数据量,如:DELETE FROM 名 WHERE 条件 LIMIT 每次删除数量 OFFSET 每次删除的偏移量; 4. 使用索引:在数据量庞大的情况下,建立合适的索引可以极大提高数据的删除效率。通过创建适当的索引,可以快速定位要删除的数据,避免全扫描的开销。 5. 禁用或简化触发器和约束:在删除大量数据时,禁用触发器和约束可以提高删除的速度。触发器和约束的验证和处理可能会增加删除操作的时间,因此在删除操作之前可以考虑临时禁用它们。 在实施删除操作之前,务必要先备份数据,以防止删除或数据丢失。此外,在高峰期避免执删除操作,以免影响其他用户的正常访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值