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将加快这一速度为什么我想在以后删除索引?保留索引是否会影响性能?是的,当然会。保持指数既有积极的一面也有消极的一面。我能想到的最重要的缺点是磁盘存储需求、插入操作开销(需要更多时间)、索引维护,因此,关于创建索引一直存在争议。但一般来说,如果您要定期使用用户字段,那么您需要它