Tôi đã nghiên cứu này, nhưng tôi vẫn không thể giải thích tại sao:Tại sao mySQL truy vấn, trái tham gia 'đáng kể' nhanh hơn so với bên trong của tôi tham gia
SELECT cl.`cl_boolean`, l.`l_name`
FROM `card_legality` cl
INNER JOIN `legality` l ON l.`legality_id` = cl.`legality_id`
WHERE cl.`card_id` = 23155
là chậm hơn so với cách đáng kể:
SELECT cl.`cl_boolean`, l.`l_name`
FROM `card_legality` cl
LEFT JOIN `legality` l ON l.`legality_id` = cl.`legality_id`
WHERE cl.`card_id` = 23155
115ms Vs 478 mili giây. Cả hai đều sử dụng InnoDB và có những mối quan hệ được xác định. 'Card_legality' chứa khoảng 200 nghìn hàng, trong khi bảng 'hợp pháp' chứa 11 hàng. Dưới đây là cấu trúc cho mỗi:
CREATE TABLE `card_legality` (
`card_id` varchar(8) NOT NULL DEFAULT '',
`legality_id` int(3) NOT NULL,
`cl_boolean` tinyint(1) NOT NULL,
PRIMARY KEY (`card_id`,`legality_id`),
KEY `legality_id` (`legality_id`),
CONSTRAINT `card_legality_ibfk_2` FOREIGN KEY (`legality_id`) REFERENCES `legality` (`legality_id`),
CONSTRAINT `card_legality_ibfk_1` FOREIGN KEY (`card_id`) REFERENCES `card` (`card_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Và:
CREATE TABLE `legality` (
`legality_id` int(3) NOT NULL AUTO_INCREMENT,
`l_name` varchar(16) NOT NULL DEFAULT '',
PRIMARY KEY (`legality_id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;
tôi chỉ đơn giản có thể sử dụng LEFT-JOIN, nhưng nó dường như không hoàn toàn đúng ... bất kỳ suy nghĩ, xin vui lòng?
CẬP NHẬT: Theo yêu cầu, tôi đã bao gồm kết quả giải thích cho từng câu hỏi. Tôi đã chạy nó trước đây, nhưng tôi không giả vờ để có một sự hiểu biết thấu đáo về nó ..
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE cl ALL PRIMARY NULL NULL NULL 199747 Using where
1 SIMPLE l eq_ref PRIMARY PRIMARY 4 hexproof.co.uk.cl.legality_id 1
AND, bên tham gia:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE l ALL PRIMARY NULL NULL NULL 11
1 SIMPLE cl ref PRIMARY,legality_id legality_id 4 hexproof.co.uk.l.legality_id 33799 Using where
Bằng cách này 'card_id' là VARCHAR vì tôi không có lựa chọn, tôi sẽ không chấp nhận điều đó bình thường. – Ben