gpt4 book ai didi

mysql 查询结构,UNION ALL 真的是这样做的正确方法吗?

转载 作者:行者123 更新时间:2023-11-29 01:22:18 25 4
gpt4 key购买 nike

我遇到一个问题,mysql 查询卡在“正在发送数据”状态,有时会持续 12-20 分钟以上,然后我看到其他查询堆积在它后面,直到我用完连接和站点关闭。看起来它们最终确实完成了,如果我坐着观察它们足够长的时间,它们就会去“删除临时表”,然后它们就会清除。

现在我没有编写这段代码,但我的任务是修复它。我为我们公司做 IT 和服务器管理工​​作,但我将网站的所有实际编码留给了我的开发人员。我对 mysql 几乎一无所知,但我的网络人员正在使用的 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 中以编程方式生成的,考虑到运行的第一个查询,所以进行更改应该不难。

更广泛地说,从查询的外观来看,您似乎每个产品类型都有一个表,而不是例如一个名为“产品”的表,其中包含类型的 ID 列,以及列出唯一产品的表。

关于mysql 查询结构,UNION ALL 真的是这样做的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16657841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com