我的 MySQL 查询似乎破坏了 MySQL 服务器(也许它只需要优化)

Posted

技术标签:

【中文标题】我的 MySQL 查询似乎破坏了 MySQL 服务器(也许它只需要优化)【英文标题】:My MySQL query seems to break MySQL servers (maybe it just needs optimising) 【发布时间】:2012-12-09 21:36:27 【问题描述】:

当我运行这个查询时,它似乎从来没有做任何事情,cpu 使用率上升到 ~30% 并保持在那里,最终 mysql 工作台超时。有没有办法更有效地做到这一点?

insert ignore into tbl_sub_model_image
select sub_model_sk,tbl_image.image_id
from tbl_sub_model sm
inner join autotalk_identicar_old.ad_vehicle av on av.vehiclekey=sm.oldid
inner join autotalk_identicar_old.id_ad_link al on av.vehiclekey=al.rbvehiclekey
inner join autotalk_identicar_old.id_features f on f.vehiclekey=al.idvehiclekey
inner join autotalk_identicar_old.id_images i on i.id_vehiclekey=f.vehiclekey
inner join tbl_image im on i.id_images.image=im.img_lnk
where substring(id_images.image,-4) <> '.tif';

基本上在旧数据库中,ad_vehicle 中的一条记录链接到 id_ad_link 中的一条(?)。 id_ad_link 中的许多都与 id_features 中的一个相关联,并且 id_features 和 id_images 是一一对应的。 在 tbl_sub_model(在新数据库中)中,我有一个名为 oldid 的字段,它是 ad_vehicle 的主键。

我想要做的是,我有一个 tbl_image 但图像已分配新的自动编号,所以我需要将旧数据库连接在一起以找出我需要将哪些图像分配给新的子模型通过使用他们的文件路径。

所有表都没有超过 60,000 条记录,但它似乎永远无法执行,奇怪的是在过去的几个月里,我一直在另一个虚拟机上很好地执行它,但现在一个新的它只是行不通。它要么陷入循环,要么永远持续下去。

有人可以帮我修复/改进它吗?

【问题讨论】:

假设两个虚拟机同样强大,您应该检查定义,尤其是旧(快速运行)环境中表的索引,并将其与新环境进行比较。 【参考方案1】:

好像你可以删掉一些连接...

insert ignore into tbl_sub_model_image
select sub_model_sk,tbl_image.image_id
from tbl_sub_model sm
inner join autotalk_identicar_old.ad_vehicle av on av.vehiclekey=sm.oldid
inner join autotalk_identicar_old.id_images i on i.id_vehiclekey=av.vehiclekey
inner join tbl_image im on i.id_images.image=im.img_lnk
where substring(id_images.image,-4) <> '.tif';

【讨论】:

不,遗憾的是,密钥不同,它是一个非常混乱的数据库,我对其执行查询的唯一原因是将数据移植到新数据库中【参考方案2】:

解决了问题。连接上使用的一些列没有被索引,所以这就是为什么要花很长时间来进行查询。

所以这个故事的寓意是......索引是你的朋友

【讨论】:

以上是关于我的 MySQL 查询似乎破坏了 MySQL 服务器(也许它只需要优化)的主要内容,如果未能解决你的问题,请参考以下文章

关于mysql限制

导致 mySQL 服务器实例关闭的 DELETE 语句?

MySQL破坏排名

来自 MySQL 数据库的查询在 node.js 和 JSON.stringify() 中返回 [Object] [Object] 似乎不起作用

通过 PHP 的“插入”mySQL 查询似乎可以工作,但没有添加任何内容

使用插入查询 CI PHP Mysql Ajax