我有以下疑问:
delete from tbl_table where user = '123'
访问示例tbl\ U表:
id user phonenumber 1 123 (408)555-5555 2 123 (415)555-5555 3 123 (913)555-5555
当我运行一个delete时,它需要7000+毫秒,这似乎太多了。这是一张40万的记录表。想知道如何构造数据库或查询以减少执行时间。
rjjhvcjd1#
这有点复杂。删除的性能受许多因素的影响:找到要删除的行需要多长时间?删除了多少行?表上构建的哪些索引也需要修改?系统上还发生了什么?表上定义了哪些删除触发器?这使得这个问题很难回答。前两个问题可以解决。首先,索引有助于:
create index idx_tbl_table_user on tbl_table(user);
要使用此索引,请确保具有正确的类型。数字标识通常存储为数字而不是字符串,类型转换有时会妨碍索引的使用。所以如果 user 是一个数字,您要写:
user
where use = 123
删除“太多”行的第二个问题可以用更困难的方式来处理。可以使用要保留的数据创建临时表,截断原始表,然后重新插入值。唉,我怀疑你能在7秒内完成,所以这不是一个选择。至于其他三个,您需要进一步调查您的系统和表,如果这些是延迟的原因。当然,如果系统负载是问题所在,那么在较安静的时间运行查询将加快查询速度。
tpgth1q72#
最好的办法是在用户列上创建索引。做你的手术删除索引(如果是一次性操作)
CREATE INDEX idx_tbl_user ON tbl_table (user); DELETE FROM tbl_table WHERE user = '123'; DROP INDEX idx_tbl_user;
2条答案
按热度按时间rjjhvcjd1#
这有点复杂。删除的性能受许多因素的影响:
找到要删除的行需要多长时间?
删除了多少行?
表上构建的哪些索引也需要修改?
系统上还发生了什么?
表上定义了哪些删除触发器?
这使得这个问题很难回答。前两个问题可以解决。首先,索引有助于:
要使用此索引,请确保具有正确的类型。数字标识通常存储为数字而不是字符串,类型转换有时会妨碍索引的使用。所以如果
user
是一个数字,您要写:删除“太多”行的第二个问题可以用更困难的方式来处理。可以使用要保留的数据创建临时表,截断原始表,然后重新插入值。唉,我怀疑你能在7秒内完成,所以这不是一个选择。
至于其他三个,您需要进一步调查您的系统和表,如果这些是延迟的原因。当然,如果系统负载是问题所在,那么在较安静的时间运行查询将加快查询速度。
tpgth1q72#
最好的办法是
在用户列上创建索引。
做你的手术
删除索引(如果是一次性操作)