mysql查询结构,UNION真的是这样做的吗?

mysql查询结构,UNION真的是这样做的吗?,mysql,Mysql,我遇到了一个问题,mysql查询陷入发送数据的状态,有时长达12-20分钟,然后我看到其他查询堆积在它后面,直到连接耗尽,站点崩溃。看起来他们最终还是会结束的,如果我坐下来观察他们足够长的时间,他们会去移除临时工作台,然后离开 现在我没有写这段代码,但我的任务是修复它。我为我们公司做IT和服务器管理工作,但我把网站的所有实际编码留给我的开发人员。我对mysql几乎一无所知,但我的web助手使用的SELECT查询在我看来很可疑。如果我读对了,他说的是在每个表中查找product_id xxxx并给

我遇到了一个问题,mysql查询陷入发送数据的状态,有时长达12-20分钟,然后我看到其他查询堆积在它后面,直到连接耗尽,站点崩溃。看起来他们最终还是会结束的,如果我坐下来观察他们足够长的时间,他们会去移除临时工作台,然后离开

现在我没有写这段代码,但我的任务是修复它。我为我们公司做IT和服务器管理工作,但我把网站的所有实际编码留给我的开发人员。我对mysql几乎一无所知,但我的web助手使用的SELECT查询在我看来很可疑。如果我读对了,他说的是在每个表中查找product_id xxxx并给我这些结果,放弃其余的结果。他声称,因为这些表是索引的,所以以这种方式调用数据不是问题

如果我从mysql控制台运行查询,返回结果需要3到20秒,而PHP实际调用查询时,返回结果的时间显然更长。请注意,它并不局限于任何一个产品ID。它似乎与我试图调用的产品没有多大区别

这是我在mysql.log中看到的

    47384 Connect   ecom_a@localhost on 
    47384 Init DB   ecom_Products
    47384 Query SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'ecom_Products'
    47384 Query 
SELECT * FROM ((SELECT * FROM `AC_Electric_Motor_Run_Capacitors`) 
UNION ALL (SELECT * FROM `AC_Electric_Motor_Start_Capacitors`) 
UNION ALL (SELECT * FROM `AC_Filters`) 
UNION ALL (SELECT * FROM `AC_Gear_Motors`) 
UNION ALL (SELECT * FROM `AC_Line_&_Load_Reactors`) 
UNION ALL (SELECT * FROM `AC_Voltage_Regulators`) 
UNION ALL (SELECT * FROM `Auxiliary_Contact_Blocks`) UNION ALL (SELECT * FROM `Bleed_Down_Resistors`) UNION ALL (SELECT * FROM `Coils`) UNION ALL (SELECT * FROM `Contactors`) UNION ALL (SELECT * FROM `Crimpers`) UNION ALL (SELECT * FROM `DC_Gear_Motors`) UNION ALL (SELECT * FROM `Diesel_Engines`) UNION ALL (SELECT * FROM `Disconnects`) UNION ALL (SELECT * FROM `Electric_Motor_Slide_Bases`) UNION ALL (SELECT * FROM `Electric_Motors`) UNION ALL (SELECT * FROM `Electric_Powered_Water_Pumps`) UNION ALL (SELECT * FROM `Electrical_Enclosures`) UNION ALL (SELECT * FROM `Engine_Powered_Water_Pumps`) UNION ALL (SELECT * FROM `External_Control_Interfaces`) UNION ALL (SELECT * FROM `Float_Switches`) UNION ALL (SELECT * FROM `Foot_Switches`) UNION ALL (SELECT * FROM `Generator_Heads`) UNION ALL (SELECT * FROM `Horizontal_Shaft_Gas_Engines`) UNION ALL (SELECT * FROM `Insulating_Resins`) UNION ALL (SELECT * FROM `Limit_Switches`) UNION ALL (SELECT * FROM `Magnet_Wire`) UNION ALL (SELECT * FROM `Manual_Transfer_Switches`) UNION ALL (SELECT * FROM `Mechanical_Interlock_Blocks`) UNION ALL (SELECT * FROM `Medium_Voltage_Transformers`) UNION ALL (SELECT * FROM `Motor_Starters`) UNION ALL (SELECT * FROM `Multi-fuel_Engines`) UNION ALL (SELECT * FROM `Overload_Relays`) UNION ALL (SELECT * FROM `PTO_Generator_3-Point_Hitch_Mounts`) UNION ALL (SELECT * FROM `PTO_Generator_Drive_Adapters`) UNION ALL (SELECT * FROM `PTO_Generator_Drive_Shafts`) UNION ALL (SELECT * FROM `PTO_Generator_Trailers`) UNION ALL (SELECT * FROM `PTO_Generators`) UNION ALL (SELECT * FROM `Packaged_Standby_Generators`) UNION ALL (SELECT * FROM `Portable_Generator_Covers`) UNION ALL (SELECT * FROM `Portable_Generator_Lifting_Provisions`) UNION ALL (SELECT * FROM `Portable_Generator_Wheel_Kits`) UNION ALL (SELECT * FROM `Portable_Generators`) UNION ALL (SELECT * FROM `Resilient_Vibration_Isolators`) UNION ALL (SELECT * FROM `Resistance_Wire`) UNION ALL (SELECT * FROM `Rotary_Frequency_Converters`) UNION ALL (SELECT * FROM `Rotary_Phase_Converters`) UNION ALL (SELECT * FROM `SO_Cable`) UNION ALL (SELECT * FROM `Single_Phase_Motors_with_Base_Mount`) UNION ALL (SELECT * FROM `Single_Phase_Motors_with_Face_&_Base_Mount`) UNION ALL (SELECT * FROM `Single_Phase_Motors_with_Face_Mount`) UNION ALL (SELECT * FROM `Soft_Starters`) UNION ALL (SELECT * FROM `Special_Metal_Wire`) UNION ALL (SELECT * FROM `Static_Frequency_Converters`) UNION ALL (SELECT * FROM `Static_Phase_Converters`) UNION ALL (SELECT * FROM `Surge_Suppressors`) UNION ALL (SELECT * FROM `Three_Phase_Motors_with_Base_Mount`) UNION ALL (SELECT * FROM `Three_Phase_Motors_with_Face_&_Base_Mount`) UNION ALL (SELECT * FROM `Three_Phase_Motors_with_Face_Mount`) UNION ALL (SELECT * FROM `Transformers_-_General`) UNION ALL (SELECT * FROM `Variable_Frequency_Drives`) UNION ALL (SELECT * FROM `Variable_Transformers`) UNION ALL (SELECT * FROM `Vehicle_&_Equipment_Batteries`) UNION ALL (SELECT * FROM `Vertical_Shaft_Gas_Engines`) UNION ALL (SELECT * FROM `Welding_Cable`) UNION ALL (SELECT * FROM `_Default`)) 
AS t WHERE product_ID = 'LF0009' LIMIT 1    

假设确实需要搜索每个表,那么如果每个子查询都应用WHERE子句会更好。目前,该查询将在应用where之前在所有表上构建一个大型结果集,然后限制结果集。也许MySQL可以优化这一点,也许它不能,但您可以尝试:

....
UNION ALL (SELECT * FROM `AC_Filters` WHERE product_ID = 'LF0009')
UNION ALL (SELECT * FROM `AC_Line_&_Load_Reactors` WHERE product_ID = 'LF0009')
....
我怀疑这个查询是在PHP中以编程方式生成的,给定了运行的第一个查询,所以进行更改应该不难


更广泛地说,从查询的外观来看,似乎每个产品类型都有一个表,而不是一个名为“products”的表,该表具有该类型的ID列,并且该表列出了唯一的产品。

如果所有这些表的表结构相同,然后,它们可能是一个带有额外字段的表,用于区分AC_齿轮_电机和AC_过滤器等。看起来所有表都有相同字段的原因是,所有字段都是从每个表中选择并合并的


此外,查看您实际需要的字段,而不是使用*

SELECT only, the, columns, i, actually, need
  FROM one_big_fat_properly_indexed_table t 
 WHERE product_ID = 'LF0009';

…哦,没有订单的限制没有什么意义,所以我放弃了它。

这有可能发生在交易中吗?同时锁定所有这些表肯定是个问题。。。它们是什么类型的桌子?迈萨姆?InnoDB?你能在每个子查询中指定product_ID而不是将其发送到包装器SELECT吗?对不起,应该提到的是,它是MYISAM。如果你能同时从所有这些表中选择所有列并返回一个有意义的结果集,那么它们首先可能不应该是单独的表!我认为你最后的陈述很准确。我们确实为每种不同类别的产品提供了一个表格,我被告知,由于我们的零件方案,有必要搜索所有表格。例如,AT0001、FT0001和MT0001都是变压器,因此从这些信息中无法很好地告诉它需要什么表。我会和他谈谈改变布置方式的问题,因为根本没有理由在泵表中查找变压器规格。是的,一张产品表和一张类型表。至少有两个产品索引,一个用于产品ID,一个用于产品类型。这肯定会使它更快,并降低死锁的机会窗口,但是,当其中一个表已经被写锁定,然后其他线程开始需要对其他表的写锁定时,同时读取锁定所有这些表仍然可能会出现死锁。请参阅:实际上,当代码得到两个结果行时,该限制很可能会阻止代码消亡。注意:列名和类型不必匹配,只需匹配总列数即可。请参阅此SQL小提琴: