【问题标题】:MYSQL Query Tuning for updating data of one table by data of next tableMYSQL Query Tuning 通过下一张表的数据更新一张表的数据
【发布时间】:2014-12-23 05:43:17
【问题描述】:

我确实有两张桌子:

1. PersonAddressList [About 5,000 records]
   Columns:
   ID int
   TITLE varchar
   CITY varchar

2. CityList [About 5,000 recods]
   Columns:
   ID int
   City_Name varchar
   City_State int //[RK to State]

之前的设计师直接在表 1 [personaddresslist] 中添加了城市名称。现在我正在对其进行规范化,并将表 1 中的城市名称替换为表 2 中的城市 ID

我使用过的查询:

更新 personaddresslist,CityList 设置 CITY = cityList.ID where CITY = 城市名

如果表的数据较少,上述查询运行良好,但如果两个表都没有大量数据,则继续滚动 n 滚动。在我的真实场景中,我在每个表中处理大约 5000 条记录的中等数据集。

那么我们该如何调优呢。

问候, 卡宾德拉

编辑 1: 关于上面查询的结果,我花了将近 40 分钟才完成脚本的运行,由于我需要在其他更多的表上运行类似的脚本,所以我想微调一下,让它更快。

【问题讨论】:

  • 你能分享一下解释的结果吗?

标签: mysql sql performance sql-update database-tuning


【解决方案1】:

您的表需要一些修改和索引以使其更快。

  • 首先要将city 存储在PersonAddressList 表中,并且数据类型是varchar,因此即使它被编入索引,它也永远不会使用它,因为它们在两个表中的数据类型不同。
  • 然后使用适当的索引。

我会从

开始
alter table PersonAddressList add index city_idx(CITY);
alter table CityList add index City_Name_idx(City_Name);

然后会使用下面的更新命令

update PersonAddressList p 
join CityList c on c.City_Name = p.CITY
set p.CITY = c.ID

上面的查询会更快,只要在应用索引之前确保CITYCity_Name的数据类型相同,大小相同。

数据更新后,您需要修复结构

drop index city_idx from PersonAddressList ;

alter table PersonAddressList change CITY CITY int ;

alter table PersonAddressList add index city_idx(CITY);

最后确保 CityList ID 被索引,如果它的主键最有可能被默认索引。

【讨论】:

  • Offtopic:问题,为​​什么在需要 CREATE INDEX 时使用 ALTER TABLE?它做同样的事情(在 MySQL 中),但对我来说更有意义。只是一种习惯还是我错过了什么?
  • @FrankHeikens 你发现的只是一种习惯。可能是一个坏的,如果是的话,我需要尽快改变它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
相关资源
最近更新 更多