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

Truy vấn MySql rất chậm

Sự khác biệt về hiệu suất là có thể do e.id_dernier_fichier nằm trong chỉ mục được sử dụng cho JOIN, nhưng e.codega không ở trong that chỉ mục.

Nếu không có định nghĩa đầy đủ về cả hai bảng và tất cả các chỉ mục của chúng, không thể nói chắc chắn. Ngoài ra, bao gồm cả hai KẾ HOẠCH GIẢI THÍCH cho hai truy vấn sẽ hữu ích.


Tuy nhiên, hiện tại, tôi có thể giải thích thêm về một vài điều ...

Nếu một INDEX được ĐIỀU CHỈNH (điều này cũng áp dụng cho các KHÓA CHÍNH), dữ liệu thực sự được lưu trữ vật lý theo thứ tự của INDEX. Điều này có nghĩa là bạn biết bạn muốn vị trí x trong INDEX cũng có nghĩa là bạn muốn vị trí x trong BẢNG.

Tuy nhiên, nếu INDEX không được nhóm lại, INDEX chỉ cung cấp một bản tra cứu cho bạn. Nói một cách hiệu quả vị trí x trong INDEX tương ứng với vị trí y trong BẢNG.

Điều quan trọng ở đây là khi truy cập các trường không được chỉ định trong INDEX. Làm như vậy có nghĩa là bạn phải thực sự vào TABLE để lấy dữ liệu. Trong trường hợp CHỈ SỐ ĐƯỢC ĐIỀU CHỈNH, bạn đã ở đó, chi phí tìm kiếm trường đó là khá thấp. Tuy nhiên, nếu INDEX không được nhóm lại, bạn thực sự phải THAM GIA BẢNG vào INDEX, sau đó tìm trường mà bạn quan tâm.


Ghi chú; Có chỉ mục tổng hợp trên (id_dernier_fichier, codega) rất khác với việc chỉ có một chỉ mục trên (id_dernier_fichier) và chỉ mục riêng biệt chỉ trên (codega) .


Trong trường hợp truy vấn của bạn, tôi nghĩ bạn không cần phải thay đổi mã nào cả. Nhưng bạn có thể hưởng lợi từ việc thay đổi các chỉ mục.

Bạn đề cập rằng bạn muốn truy cập nhiều lĩnh vực. Đặt tất cả các trường đó trong một chỉ mục tổng hợp có lẽ không phải là giải pháp tốt nhất. Thay vào đó, bạn có thể muốn tạo CHỈ SỐ ĐƯỢC CHỈ ĐỊNH trên (id_dernier_fichier) . Điều này có nghĩa là khi * id_dernier_fichier * đã được định vị, bạn cũng đã ở đúng nơi để lấy tất cả các trường khác.


CHỈNH SỬA Lưu ý về MySQL và CHỈ SỐ ĐƯỢC CHỈ ĐỊNH

13.2.10.1. Chỉ mục nhóm và chỉ mục phụ

Mỗi bảng InnoDB có một chỉ mục đặc biệt được gọi là chỉ mục nhóm nơi lưu trữ dữ liệu cho các hàng:

  • Nếu bạn xác định một TỪ KHÓA CHÍNH trên bảng của mình, InnoDB sẽ sử dụng nó làm chỉ mục nhóm.
  • Nếu bạn không xác định một KHÓA CHÍNH cho bảng của mình, MySQL sẽ chọn chỉ mục DUY NHẤT đầu tiên chỉ có các cột KHÔNG ĐỦ làm khóa chính và InnoDB sử dụng nó làm chỉ mục nhóm.
  • Nếu bảng không có KHÓA CHÍNH hoặc chỉ mục DUY NHẤT phù hợp, InnoDB sẽ tạo chỉ mục nhóm ẩn trên một cột tổng hợp chứa các giá trị ID hàng. Các hàng được sắp xếp theo ID mà InnoDB chỉ định cho các hàng trong bảng như vậy. ID hàng là một trường 6 byte tăng đơn điệu khi các hàng mới được chèn vào. Do đó, các hàng được sắp xếp theo ID hàng về mặt vật lý theo thứ tự chèn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng các trường ảo trong cakePHP 2.x

  2. Xóa một phần của chuỗi trong MYSQL

  3. Sử dụng biến trong việc đặt giá trị bảng mysql INNODB AUTO_INCREMENT

  4. Loại bỏ các chuỗi con trùng lặp

  5. Ngoại lệ trong luồng chính org.hibernate.HibernateException:Lỗi khi truy cập luồng stax