2013-05-20 1 views
2

mysql 쿼리가 "데이터 전송 중"상태에서 멈추는 경우가 있습니다. 12 ~ 20 분 이상이 걸리는 경우가 있습니다. 그런 다음 연결이 끊어 질 때까지 다른 쿼리가 스택에 표시되는 것을 볼 수 있습니다. 내려 간다. 그들이 앉아서 내가 충분히 긴 시간을 지켜 보면서 "임시 직원 테이블 제거"에 가서 결국 끝내면 결국 끝내는 것 같습니다.mysql 쿼리 구조, 정말이 일을하는 올바른 방법입니다.

이제이 코드를 작성하지 않았지만이를 수정해야합니다. 우리 회사의 IT 및 서버 관리 작업을 수행하지만 실제 개발자를 대상으로 실제 코드를 작성합니다. 나는 mysql에 관해서는 아무것도 모르지만, 나의 웹 녀석이 사용하고있는 SELECT 쿼리는 나에게 물고기 같아 보인다. 만약 내가 읽는다면 그는 "모든 단일 테이블에서 product_id xxxx를 찾아 내고 그 결과를주고, 나머지는 버린다"라고 말하고있다. 테이블이 색인되기 때문에 데이터를 이런 식으로 호출하는 것이 문제가되지 않는다고 주장한다.

mysql 콘솔에서 쿼리를 실행하면 결과를 반환하는 데 3 ~ 20 초가 걸리고, 실제로 PHP에서 실제로 호출하면 길어집니다. 하나의 제품 ID에만 국한되지는 않습니다. 내가 전화하려고하는 제품이별로 다르지 않은 것 같습니다.

이 내가 mysql.log 정말 각 테이블을 검색 할 필요가 가정

47384 Connect [email protected] 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  
+0

거래에서 어떤 일이 일어날 수 있습니까? 모든 테이블을 한꺼번에 잠그는 것은 확실히 문제가 될 수 있습니다 ... (MyISAM? InnoDB?) –

+1

각 하위 쿼리에서 래퍼'SELECT'로 보내는 대신 product_ID를 지정할 수 있습니까? – imthepitts

+0

죄송합니다. 언급해야 할 것은 MYISAM입니다. – Xytrix01

답변

3

에서 볼 것입니다, 그것은 더 좋을 것이다 각 하위 쿼리는 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 열이있는 'products'테이블 및 고유 제품을 나열하는 테이블.

+0

나는 당신의 마지막 성명서가 그것을 못살게 굴 것 같아요. 우리는 실제로 제품의 각기 다른 카테고리에 대한 테이블을 가지고 있으며, 파트 # 스키마로 인해 모든 테이블을 검색해야한다고 들었습니다.예를 들어, AT0001, FT0001 및 MT0001은 모두 변압기이므로 필요한 정보가 무엇인지 알기위한 좋은 방법은 없습니다. 나는 이것이 배치 된 방식을 바꾸는 것에 대해 그에게 이야기 할 것이다. 광고는 변압기 사양에 대한 "펌프"표를 볼 이유가 없다. – Xytrix01

+0

예, 제품에 대한 표와 유형에 대한 표. 제품에 대한 두 개 이상의 인덱스 (제품 ID 및 제품 유형에 하나씩) –

+1

이것은 교착 상태에 대한 기회 창을 훨씬 더 빠르게하고 낮추지 만, 모든 테이블을 한 번에 읽기 잠금으로 설정하면 그 중 하나가 이미 쓰기 잠금 상태가되어 다른 스레드가 원할 때 교착 상태가 발생할 가능성이 있습니다 다른 테이블에 대한 쓰기 잠금. 참조하십시오 : http://stackoverflow.com/questions/6415195/myisam-place-table-lock-on-table-even-when-dealing-with-select-query –

2

모든 테이블의 테이블 구조가 동일하면 AC_Gear_MotorsAC_Filters을 구별하는 추가 필드가있는 단일 테이블이어야합니다. 모든 필드가 동일한 필드를 갖고있는 것처럼 보이는 이유는 모든 필드가 각 테이블에서 선택되고 UNION이됩니다.

또한 * 대신 실제로 필요한 필드를 확인하십시오.

+0

오, 당신이 이미 그것을 말했다 – Strawberry

1

이 가능성이 훨씬 더 수행합니다 ...

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

... 아, 그리고 ORDER BY없이 LIMIT는 거의 의미가, 그래서 그것을 중단.

+0

사실,'LIMIT '는 결과 행이 두 개인 경우 코드가 죽는 것을 막을 수 있습니다. 참고 : 열 이름과 유형이 일치하지 않아도됩니다. 총 열 수만입니다. 이 SQL fiddle을보십시오 : http://sqlfiddle.com/#!2/928fd/8 –

관련 문제