Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Các vấn đề nghiêm trọng về hiệu suất truy vấn MySQL sau khi thêm điều kiện

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ì codeLONGTEXT , đ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 e3v9 ?)

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Sắp xếp theo một số, Nulls cuối cùng

  2. Java - Ngoại lệ trong luồng chính java.lang. Lỗi:Các vấn đề biên dịch chưa được giải quyết

  3. Json MySql nhận được hai số nguyên và một chuỗi

  4. bảng tạm thời mysql có phải là duy nhất cho mỗi người dùng truy cập tập lệnh tạo ra nó không ...?

  5. MySQL - Tìm nạp giá trị thấp nhất