Mysql 在基于外键检索多个记录时,是否有方法优化查询?

Mysql 在基于外键检索多个记录时,是否有方法优化查询?,mysql,sql,Mysql,Sql,我有以下疑问: delete from tbl_table where user = '123' 访问示例tbl_表: id user phonenumber 1 123 (408)555-5555 2 123 (415)555-5555 3 123 (913)555-5555 当我运行delete时,需要7000毫秒以上的时间,这似乎太多了。这是一个400k的记录表 我想知道如何构造数据库或查询以减少执行时间。最好的方法是 在用户列上创建索引 做你的手术 删除索引(如果是一次性操作)

我有以下疑问:

delete from tbl_table
where user = '123'
访问示例tbl_表:

id user phonenumber
1 123 (408)555-5555
2 123 (415)555-5555
3 123 (913)555-5555
当我运行delete时,需要7000毫秒以上的时间,这似乎太多了。这是一个400k的记录表


我想知道如何构造数据库或查询以减少执行时间。

最好的方法是

  • 在用户列上创建索引
  • 做你的手术
  • 删除索引(如果是一次性操作)

CREATE INDEX idx_tbl_user ON tbl_table (user); 
DELETE FROM tbl_table WHERE user = '123'; 
DROP INDEX idx_tbl_user;

这有点复杂。删除的性能受许多因素的影响:

  • 查找要删除的行需要多长时间
  • 正在删除多少行
  • 表上构建的哪些索引也需要修改
  • 系统上还发生了什么
  • 表上定义了哪些删除触发器
这使得这个问题很难回答。前两个问题可以解决。首先,索引有助于:

create index idx_tbl_table_user on tbl_table(user);
要使用此索引,请确保具有正确的类型。数字ID通常存储为数字而不是字符串——类型转换有时会妨碍索引的使用。因此,如果
user
是一个数字,您需要写:

where use = 123

删除“太多”行的第二个问题可以用一种更困难的方式来处理。可以使用要保留的数据创建临时表,截断原始表,然后重新插入值。唉,我怀疑你能在7秒钟内完成,所以这不是一个选项


至于其他三个,您需要进一步调查您的系统和表,如果这些是延迟的原因。当然,如果系统负载是问题,那么在较安静的时间运行查询将加快查询速度。

您可能会考虑“软删除”,而仅仅是问题可能/将是欧盟GDPR遵从,即使您的公司不在欧盟内,只要您处理的是欧盟企业、居民或公民的数据,您必须遵守GDPR。。您可以先“软删除”,然后在晚上使用cronjob/MySQL事件“硬删除”“您可以创建一个包含您想要保留的数据的临时表,截断原始表”,这很可能会创建一个基于磁盘的临时表,速度会很慢。。。在ramdisk上安装MySQL的tempdir将加快这一速度为什么我想在以后删除索引?保留索引是否会影响性能?是的,当然会。保持指数既有积极的一面也有消极的一面。我能想到的最重要的缺点是磁盘存储需求、插入操作开销(需要更多时间)、索引维护,因此,关于创建索引一直存在争议。但一般来说,如果您要定期使用用户字段,那么您需要它