2

mysql クエリが「データ送信中」の状態でスタックする問題があり、12 ~ 20 分以上かかることがあります。その後、接続が切れてサイトがダウンするまで、他のクエリがその背後に積み重なっているのが見えます。 . 最終的には終了するようですが、座って十分に長く見ていると、「一時テーブルの削除」に進み、クリアします。

今、私はこのコードを書いていませんが、それを修正する任務を負っています。私は会社の IT とサーバー管理を担当していますが、サイトの実際のコーディングはすべて開発者に任せています。私は mysql についてほとんど何も知りませんが、私の Web 担当者が使用している SELECT クエリは怪しいように見えます。私がそれを正しく読んでいれば、彼は「すべてのテーブルでproduct_id xxxxを探して、それらの結果を出して、残りを破棄してください」と言っています.

mysql コンソールからクエリを実行すると、結果が返されるまでに 3 ~ 20 秒かかり、PHP が実際に呼び出すと、明らかに時間がかかります。1 つの製品 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    
4

3 に答える 3

3

各テーブルを検索することが本当に必要であると仮定すると、各サブクエリに WHERE 句を適用した方がよいでしょう。現状では、このクエリは、where を適用してから結果セットを制限する前に、すべてのテーブルに対して 1 つのメガ結果セットを構築します。おそらく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 列を持つ「products」というテーブルや、固有の製品をリストするテーブルではなく、製品タイプごとのテーブルがあるように見えます。

于 2013-05-20T20:43:38.123 に答える
2

これらすべてのテーブルのテーブル構造が同一である場合、それらはおそらく、その他のフィールドと区別するための追加のフィールドを持つ単一のテーブルである必要がありますAC_Gear_MotorsAC_Filtersすべてのテーブルに同一のフィールドがあるように見える理由は、すべてのフィールドが各テーブルから選択されているためです。 UNIONされています。

さらに、を使用する代わりに、実際に必要なフィールドを特定することを検討してください*

于 2013-05-20T20:44:24.743 に答える
1

これはおそらくはるかにパフォーマンスが向上します...

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

...ああ、ORDER BY なしの LIMIT はほとんど意味がないので、省略しました。

于 2013-05-20T21:02:39.737 に答える