หากเราพิจารณาว่าคุณใช้INNER JOIN
แทนLEFT JOIN
(ซึ่งดูเหมือนจะเป็นเจตนาของคุณ) เคียวรีทั้งสองนี้จะเทียบเท่ากับหน้าที่ ตัวเพิ่มประสิทธิภาพข้อความค้นหาจะตรวจสอบและประเมินเกณฑ์ในWHERE
ส่วนคำสั่งและส่วนคำสั่งของคุณFROM
และพิจารณาปัจจัยเหล่านี้ทั้งหมดเมื่อสร้างแผนแบบสอบถามเพื่อให้บรรลุแผนการดำเนินการที่มีประสิทธิภาพมากที่สุด หากเราทำEXPLAIN
ทั้งสองคำสั่งเราจะได้ผลลัพธ์เดียวกัน:
แบบสอบถาม 1 :
EXPLAIN
SELECT
tableA.ColA
,tableA.ColB
,tableA.ColC
,tableA.ColD
,tableA.ColE
FROM tableA
JOIN tableB ON tableA.ColA=tableB.ColA
WHERE
tableA.ColB=tableB.ColB
AND tableA.ColC=tableB.ColC
AND tableA.ColD=tableB.ColD
AND tableA.ColE=tableB.ColE
[ผลลัพธ์] :
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA |
------------------------------------------------------------------------------------------------------------------------
| 1 | SIMPLE | tableA | ALL | (null) | (null) | (null) | (null) | 1 | |
| 1 | SIMPLE | tableB | ALL | (null) | (null) | (null) | (null) | 1 | Using where; Using join buffer |
แบบสอบถาม 2 :
EXPLAIN
SELECT
tableA.ColA
,tableA.ColB
,tableA.ColC
,tableA.ColD
,tableA.ColE
FROM tableA
JOIN tableB ON tableA.ColA=tableB.ColA
AND tableA.ColB=tableB.ColB
AND tableA.ColC=tableB.ColC
AND tableA.ColD=tableB.ColD
WHERE
tableA.ColE=tableB.ColE
[ผลลัพธ์] :
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA |
------------------------------------------------------------------------------------------------------------------------
| 1 | SIMPLE | tableA | ALL | (null) | (null) | (null) | (null) | 1 | |
| 1 | SIMPLE | tableB | ALL | (null) | (null) | (null) | (null) | 1 | Using where; Using join buffer |
คุณสามารถตรวจสอบรายละเอียดทั้งหมดได้จากลิงค์ต่อไปนี้ ฉันยังสร้างตัวอย่าง SQL 2008 เพื่อให้คุณสามารถเปรียบเทียบการทำงานของเอ็นจิ้นทั้งสอง (ซึ่งเหมือนกัน):
ตัวอย่างแบบสอบถาม MySQL
ตัวอย่างแบบสอบถาม SQL 2008 (ตรวจสอบให้แน่ใจว่าคุณ 'ดูแผนปฏิบัติการ' สำหรับผลลัพธ์ทั้งสองรายการ)
INNER JOIN
แต่ด้วยสิ่งLEFT JOIN
นี้จะให้ผลลัพธ์ที่แตกต่าง โดยทั่วไปเงื่อนไขที่คุณเพิ่มลงในWHERE
แบบสอบถามที่สองของคุณจะแปลงJOIN
เป็นINNER JOIN