STRAIGHT_JOIN hoạt động giống INNER JOIN nhưng ép buộc MySQL đọc bảng bên trái trước bảng bên phải (ghi đè optimizer). Dùng khi optimizer chọn sai thứ tự join gây chậm.
Chuẩn bị: 2 bảng có khóa ngoại
CREATE TABLE ForeignTableDemo (Id INT, Name VARCHAR(100), FK INT); CREATE TABLE PrimaryTableDemo (FK INT, Address VARCHAR(100), PRIMARY KEY(FK)); ALTER TABLE ForeignTableDemo ADD CONSTRAINT FKConst FOREIGN KEY (FK) REFERENCES PrimaryTableDemo(FK); INSERT INTO PrimaryTableDemo VALUES(1,'US'), (2,'UK'), (3,'Unknown'); INSERT INTO ForeignTableDemo VALUES(1,'John',1), (2,'Bob',2);
STRAIGHT_JOIN
SELECT ForeignTableDemo.Id, ForeignTableDemo.Name, PrimaryTableDemo.Address FROM ForeignTableDemo STRAIGHT_JOIN PrimaryTableDemo ON ForeignTableDemo.FK = PrimaryTableDemo.FK;
Kết quả (chỉ hàng khớp):
+------+------+---------+ | Id | Name | Address | +------+------+---------+ | 1 | John | US | | 2 | Bob | UK | +------+------+---------+
Khi nào dùng?
- Bảng trái nhỏ, bảng phải lớn, index trên cột join của bảng phải tốt -> optimizer có thể chọn sai (scan bảng lớn trước).
STRAIGHT_JOINép join theo thứ tự viết: bảng trái -> bảng phải.- Cẩn thận: lạm dụng có thể làm chậm hơn nếu đoán sai. Chỉ dùng sau khi
EXPLAINchứng minh optimizer sai.