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(30 个字段)记录,tbl_orders_log 17000(5 个字段)记录。我不知道它最终是否会返回,因为我在实时服务器上运行它并且担心过载。
我正在成功地进行类似的查询和更复杂的查询。
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
索引信息
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
嗨,我有(在帮助下) 重写查询
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');
立即执行
最佳答案
因为有人锁定了其中一个表或一行。例如,如果您在 session 中禁用了自动提交(这样您就可以回滚您的修改)并忘记在那里提交,就会发生这种情况。
This document可能有帮助。
[编辑] 发布表定义后,您可以看到两个连接列的类型不同。现在的问题是:当您运行查询时,哪种类型将被向上/向下转换?在您的情况下,最好将 PAYMENT_TRANSACTION_LOG_ID
类型转换为 varchar
,尤其是当您在 TRANSACTION_ID
上有索引时(您应该为此查询创建)。
这样,表 tbl_order_head
中的几行(甚至一行)将被选中,然后在表 tbl_orders_log
中进行快速查找。如果没有这个,数据库将从日志表中加载所有记录,并检查每条记录是否与找到的订单标题匹配(加上将每个 ID 转换为标题中的类型等)。
关于mysql - 为什么这个 MySQL 查询挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2591248/