Vui lòng cung cấp SHOW CREATE TABLE
.
Tôi hy vọng sẽ thấy các chỉ mục tổng hợp này:
`val`: (entityId, attributeId) -- order is not critical
Than ôi, vì code
là LONGTEXT
, điều này không thể thực hiện được đối với entity
:INDEX(type, code, entityId)
. Do đó, điều này sẽ không hiệu quả lắm:
SELECT entityId
from entity
where code = v9.Value
and type = 97
limit 1
Tôi thấy LIMIT
với ORDER BY
- bạn có quan tâm bạn nhận được giá trị nào không?
Có lẽ điều đó sẽ tốt hơn được viết dưới dạng
WHERE EXISTS ( SELECT 1 FROM entity
WHERE entityID = e3.entityID
AND code = v9.Value
AND type = 97 )
(Bạn có chắc chắn về hỗn hợp của e3
và v9
?)
Bao bọc ...
Điều này buộc LEFT JOIN
để trở thành JOIN
. Và nó sẽ loại bỏ ORDER BY
bên trong sau đó .
Sau đó, Trình tối ưu hóa có thể quyết định tốt nhất nên bắt đầu bằng 68e9145e-43eb-4581-9727-4212be41bef5
, mà tôi gọi là val AS v11
:
JOIN val AS v11 ON (v11.entityId = e2.id
and v11.attributeId = 1614)
AND v11.Value = 'bar2')
Nếu đây là một bảng EAV, thì tất cả những gì nó làm là xác minh rằng [, 1514] có giá trị 'bar2'. Đây có vẻ không phải là một bài kiểm tra hợp lý.
ngoài đề xuất trước đây của tôi.
Tôi muốn EXPLAIN SELECT ...
.
EAV
Giả sử val
là một bảng EAV truyền thống, điều này có lẽ sẽ tốt hơn nhiều:
CREATE TABLE `val` (
`attributeId` int(11) NOT NULL,
`entityId` int(11) NOT NULL,
`Value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
PRIMARY KEY(`entityId`,`attributeId`),
KEY `IX_val_attributeId` (`attributeId`),
) ENGINE=InnoDB AUTO_INCREMENT=2325375 DEFAULT CHARSET=latin1
Hai ID không có giá trị sử dụng thực tế (trừ khi tôi thiếu thứ gì đó). Nếu bạn buộc phải sử dụng chúng vì một khuôn khổ, điều đó thật đáng tiếc. Việc quảng bá (entityId, thuộc tínhId) thành PK khiến cho việc tìm nạp giá trị value
nhanh hơn một chút.
Không có cách nào hữu ích để bao gồm LONGTEXT
trong bất kỳ chỉ mục nào, vì vậy một số đề xuất trước đây của tôi cần thay đổi.