2010-04-07 44 views
6
SELECT * 
FROM tbl_order_head AS o 
INNER JOIN tbl_orders_log AS c 
ON o.PAYMENT_TRANSACTION_LOG_ID=c.TRANSACTION_ID 
WHERE o.VISUAL_ID = '77783'; 

tbl_order_head 67,000 registros (30 campos), registros tbl_orders_log 17000 (5 campos). No sé si finalmente volverá ya que lo estoy ejecutando en un servidor en vivo y temo sobrecargarlo.¿Por qué cuelga esta consulta MySQL?

Estoy haciendo consultas similares y consultas mucho más complejas con éxito.

tbl_orders_log

Field Type Comment 
ID bigint(20) NOT NULL 
TRANSACTION_ID varchar(1000) NULL 
CREATED datetime NULL 
AMENDED datetime NULL 
PAYMENT_CARD_NUMBER varchar(255) NULL 
PAYMENT_CARD_TYPE varchar(255) NULL 
SESSION_ID varchar(255) NULL 
TRANSACTION_TYPE varchar(255) NULL 
TRANSACTION_VALUE varchar(255) NULL 
LOG_DATA text NULL 

Información Índice

Indexes Columns Index_Type 
PRIMARY ID Unique 

tbl_order_head

CREATE TABLE `tbl_order_head` (
    `ID` varchar(255) NOT NULL, 
    `VISUAL_ID` decimal(20,0) DEFAULT NULL, 
    `CREATED` datetime DEFAULT NULL, 
    `AMENDED` datetime DEFAULT NULL, 
    `CUSTOMER_ID` varchar(255) DEFAULT NULL, 
    `BILLING_ID` varchar(255) DEFAULT NULL, 
    `ORDER_LINES_ITEM_VALUE` varchar(20) DEFAULT NULL, 
    `DELIVERY_VALUE` varchar(20) DEFAULT NULL, 
    `ORDER_LINES_ITEM_TAX` varchar(20) DEFAULT NULL, 
    `DELIVERY_TAX` varchar(20) DEFAULT NULL, 
    `DELIVERY_ALLOCATED_ITEMS_VALUE` varchar(20) DEFAULT NULL, 
    `DELIVERY_ALLOCATED_ITEMS_TAX` varchar(20) DEFAULT NULL, 
    `DELIVERY_ALLOCATED_ITEMS_TAX_DEDUCTION` varchar(20) DEFAULT NULL, 
    `DELIVERY_TAX_DEDUCTION` varchar(20) DEFAULT NULL, 
    `LOYALTY_CARD_POINTS_EARNED` varchar(10) DEFAULT NULL, 
    `LOYALTY_CARD_POINTS_REDEEMED` varchar(10) DEFAULT NULL, 
    `LOYALTY_CARD_POINTS_REDEEMED_VALUE` varchar(20) DEFAULT NULL, 
    `VOUCHER_CODE` varchar(50) DEFAULT NULL, 
    `AFFILIATE_CODE` varchar(50) DEFAULT NULL, 
    `LOYALTY_CARD_NUMBER` varchar(209) DEFAULT NULL, 
    `REDEEM_LOYALTY_CARD_POINTS` varchar(1) DEFAULT NULL, 
    `SOURCE` varchar(50) DEFAULT NULL, 
    `SKU_DATA` text, 
    `SKU_TAX_DATA` text, 
    `DISCOUNT_DATA` text, 
    `PAYMENT_CARD_TYPE` varchar(6) DEFAULT NULL, 
    `PAYMENT_CARD_NUMBER` varchar(255) DEFAULT NULL, 
    `PAYMENT_CARD_START_MONTH` varchar(6) DEFAULT NULL, 
    `PAYMENT_CARD_EXPIRY_MONTH` varchar(6) DEFAULT NULL, 
    `PAYMENT_CARD_START_YEAR` varchar(6) DEFAULT NULL, 
    `PAYMENT_CARD_EXPIRY_YEAR` varchar(6) DEFAULT NULL, 
    `PAYMENT_CARD_ISSUE_NUMBER` varchar(3) DEFAULT NULL, 
    `PAYMENT_CARD_SECURITY_NUMBER` varchar(4) DEFAULT NULL, 
    `PAYMENT_CARD_NAME` varchar(50) DEFAULT NULL, 
    `PAYMENT_CARD_SAVE` varchar(1) DEFAULT NULL, 
    `PAYMENT_CARD_CHARGE_AMOUNT` varchar(10) DEFAULT NULL, 
    `SAVED_PAYMENT_CARD_ID` varchar(255) DEFAULT NULL, 
    `SAVED_PAYMENT_CARD_SECURITY_NUMBER` varchar(255) DEFAULT NULL, 
    `GIFT_VOUCHER_DATA` text, 
    `GIFT_VOUCHER_APPLIED_VALUE` varchar(10) DEFAULT NULL, 
    `LOYALTY_EARNED_SKU_DATA` text, 
    `LOYALTY_REDEMPTION_SKU_DATA` text, 
    `LOYALTY_REDEMPTION_DEDUCTED_SKU_DATA` text, 
    `PAYMENT_CARD_AUTH_CODE` varchar(10) DEFAULT NULL, 
    `PAYMENT_TRANSACTION_LOG_ID` text, 
    `CREATED_BY` varchar(20) DEFAULT NULL, 
    `BASKET_ID` varchar(255) DEFAULT NULL, 
    `SKU_DESCRIPTION_XREF` text, 
    `IP_TRANSACTION_NUMBER` varchar(255) DEFAULT NULL, 
    `MEMS_BESPOKE_DISCOUNT_DATA` text, 
    `IP_EXPORTED` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`ID`), 
    KEY `CUSTOMER_ID` (`CUSTOMER_ID`,`CREATED`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

Hola He (con ayuda) reescrito la consulta

SELECT * FROM tbl_orders_log WHERE TRANSACTION_ID=(SELECT o.PAYMENT_TRANSACTION_LOG_ID FROM tbl_order_head AS o WHERE o.VISUAL_ID = '77783'); 

que se ejecuta instantáneamente

+0

¿Ha comprobado su base de datos si una de estas tablas está bloqueada? – hallie

Respuesta

1

Porque alguien ha bloqueado una de las tablas o una sola fila. Esto puede suceder, por ejemplo, si ha deshabilitado la confirmación automática (para que pueda deshacer las modificaciones) en una sesión y olvidó comprometerse allí.

This document puede ayudar.

[EDITAR] Después de publicar las definiciones de tablas, puede ver que los tipos de las dos columnas de unión son diferentes. Ahora la pregunta es: ¿qué tipo se activará/disminuirá cuando ejecute la consulta? En su caso, podría ser mejor emitir el tipo de PAYMENT_TRANSACTION_LOG_ID a varchar, especialmente si tiene un índice en TRANSACTION_ID (que debe crear para esta consulta).

De esta manera, se seleccionarán algunas filas (o incluso una sola) de la tabla tbl_order_head y luego, se realizará una búsqueda rápida en la tabla tbl_orders_log. Sin esto, la base de datos cargará todos los registros de la tabla de registro y comprobará cada registro para una coincidencia en los encabezados de orden encontrados (además de convertir cada ID al tipo en el encabezado, etc.).

+0

Hmm nunca lo consideró, pero estoy ejecutando la consulta desde una consola en un servidor activo. Supongo que los registros individuales podrían estar bloqueados, pero ¿cómo puedo saberlo? y en cualquier caso, puedo ver las tablas individuales? – zzapper

+0

Consulte el enlace para determinar bloqueos y bloqueos. –

+0

Creó un índice para TRANSACTION_ID y la consulta se ejecutó de inmediato.Así que esto resolvió mi problema, gracias – zzapper

1

¿Ha ejecutado EXPLAIN en su consulta para ver el plan de consulta?

EXPLAIN SELECT * FROM tbl_order_head AS o INNER JOIN tbl_orders_log AS 
c ON o.PAYMENT_TRANSACTION_LOG_ID=c.TRANSACTION_ID WHERE o.VISUAL_ID = '77783' 

Su unión podría dar como resultado el examen de millones/miles de millones de filas. ¿Sus tablas están correctamente indexadas para esta unión?

+0

La explicación devolvió "id", "tipo_selección", "tabla", "tipo", "claves_posibles", "clave", "key_len", "ref", "filas", "Extra" "1", "SIMPLE", "c", "TODO", \ N, \ N, \ N, \ N, "16633", "" "1", "SIMPLE", " o "," ALL ", \ N, \ N, \ N, \ N," 59696 "," Using where " – zzapper

+0

Parece que está realizando un escaneo de tabla (examinando todas las filas), sería útil si pudiera 'SHOW CREATE TABLA

\ G' para ambas tablas en esta consulta e incluirla en su pregunta. –

+0

Ahora puedo ver que los transaction_ids indexados son uno a varchar (1000) y el otro a un campo de texto (base de datos no diseñada por mí) – zzapper

0

Creo que debería ser o.TRANSACTION_ID y c.PAYMENT_TRANSACTION_LOG_ID en lugar de c.TRANSACTION_ID y o.PAYMENT_TRANSACTION_LOG_ID. Entonces la consulta debería verse así:

SELECT * FROM tbl_order_head o 
INNER JOIN tbl_orders_log c 
ON c.PAYMENT_TRANSACTION_LOG_ID=o.TRANSACTION_ID 
WHERE o.VISUAL_ID = '77783'; 
Cuestiones relacionadas