【问题标题】:Query execution taking long查询执行时间长
【发布时间】:2014-08-07 15:14:41
【问题描述】:

我目前正在使用 mysql

我有两个名为 person 和 zim_list_id 的表,这两个表都有超过 200 万行

我想使用 zim_list_id 表更新人员表

我使用的查询是

update person p JOIN zim_list_id z on p.person_id = z.person_id
set  p.office_name = z.`Office Name`;

我还在 zim_list_id 表和 person 表上创建了索引,我执行的查询是

create index idx_person_office_name on person(`Office_name`);
create index idx_zim_list_id_office_name on zim_list_id(`Office name`);

查询执行需要很长时间。有什么办法可以减少执行时间?

【问题讨论】:

  • 您的连接列上是否已有索引? (person_id) 在两个表中?
  • 请定义“非常长”。在添加索引之前和之后是否进行了测量?表上还有其他索引吗?
  • 我删除了所有索引,但没有任何区别

标签: mysql sql mysql-workbench


【解决方案1】:

Office Name 上的索引对这个查询没有任何作用。您对这些索引所做的只是使插入和更新速度变慢,因为现在数据库必须在列更改时更新索引。

如果您还没有索引,那么您真正需要的是这些表中 person_id 字段的索引,以提高连接效率。

您还可以考虑将 Office_Name 添加为zim_list_id 表索引上的second 列,因为这将允许数据库完全从索引中填充该部分查询。但在我先设置普通的 person_id 索引后检查结果之前,我不会这样做。

最后,我很好奇该服务器中有多少内存(尤其是相对于数据库的总大小),您的 MySql buffer_pool_size 设置中有多少可用内存,以及该服务器可能正在做的其他工作。 .. 也可能有环境因素。

【讨论】:

  • “您也可以考虑将Office_Name 添加为zim_list_id 表的第二列”...您的意思是“作为zim_list_id 表的person_id 索引的第二列” ?
  • 好的,我删除了所有索引,但没有任何区别
  • 好的,成功了。我在两个表的 person_id 上都创建了索引。更新只用了 72 秒。我在 office_name 上创建索引时出错。谢谢乔尔
猜你喜欢
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 2012-03-11
  • 1970-01-01
相关资源
最近更新 更多