MySQL の質問です。
契約書と注文ファイルがあります。標準の親子 - 1 対多の関係。コントラクトには多くの注文を含めることができます。一般的な結合フィールドは c_contract_id = co_contract_id です。
契約には、契約を修飾する c_type_code があり、注文にも co_order_type_code があります。
ユーザーが多くのフィールドに基づいて選択できる一般的な検索を構築しています。問題を引き起こしているクエリは、contract または contract_orders テーブルのいずれかに特定の type_code を持つ契約の contract_id を見つけることです。
テーブルには、ユーザーが検索できる多くのフィールドがあります。私の質問に関連するフィールドは次のとおりです。
CREATE TABLE `ndx_contracts` (
`c_contract_id` int(11) NOT NULL AUTO_INCREMENT,
`c_type_code` char(2) NOT NULL,
PRIMARY KEY (`c_contract_id`),
KEY `c_type_code` (`c_type_code`)
) ENGINE=InnoDB AUTO_INCREMENT=1
CREATE TABLE `ndx_contract_orders` (
`co_contract_id` int(11) NOT NULL,
`co_contract_orderid` int(11) NOT NULL AUTO_INCREMENT,
`co_order_type_code` varchar(2) NOT NULL,
`co_data` varchar(255),
PRIMARY KEY (`co_contract_orderid`,`co_contractid`),
KEY `co_order_type_code` (`co_order_type_code`)
) ENGINE=InnoDB AUTO_INCREMENT=1
SELECT count(1)
FROM contracts
WHERE
c_type_code IN ('02')
OR (
(SELECT count(co_order_type_code) FROM contract_orders
WHERE
co_contract_id = c_contract_id
AND co_order_type_code IN ('02')
) > 0
)
;
このクエリは機能しますが、非常に遅いです。約 40,000 の契約しかなく、それぞれに約 4 つの注文レコードがあり、検索に 311 秒以上かかり、320 秒の行が返されます。
外部結合を行いますが、多くの余分な行が返されます。
ありがとうございました