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

MySQL index cardinality - hiệu suất so với hiệu quả lưu trữ

Cardinality cao hơn có nghĩa là hiệu suất đọc tốt hơn vì theo định nghĩa, có ít bản ghi hơn để đọc.

Để xử lý một truy vấn như thế này:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue

, động cơ sẽ thực hiện các bước sau:

  1. Tìm mục nhập đầu tiên thỏa mãn điều kiện.

    Điều này được thực hiện qua B-Tree , bắt đầu từ mục gốc.

    Trên các trang, tìm kiếm được thực hiện theo B-Tree các liên kết; trong một trang, tìm kiếm được thực hiện bằng tìm kiếm nhị phân (trừ khi các khóa của bạn được nén, trong trường hợp đó là tìm kiếm tuyến tính).

    Thuật toán này có hiệu quả như nhau đối với cả cột có số lượng cao và số lượng thấp. Tìm 3 đầu tiên (trái ngược với bất kỳ 3 nào ) trong các danh sách sau:

    1  2  3  4  5  6  7  8  9  10
    
    3  3  3  3  3  3  3  3  4  4
    

    yêu cầu cùng một O(log(n)) các bước.

  2. Duyệt qua chỉ mục cho đến khi giá trị khóa thay đổi. Tất nhiên, điều này đòi hỏi thời gian tuyến tính:bạn càng có nhiều bản ghi, bạn càng cần duyệt qua nhiều hơn.

Nếu bạn chỉ cần bản ghi đầu tiên:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue
LIMIT 1

, bản số cột không ảnh hưởng đến hiệu suất đọc.

Mỗi khóa chỉ mục có một giá trị bổ sung ẩn:một con trỏ bản ghi. Đây là toàn bộ điểm của việc có một chỉ mục:bạn cần biết nó trỏ đến bản ghi nào.

Vì một con trỏ bản ghi, theo định nghĩa, là duy nhất, mỗi khóa chỉ mục cũng là duy nhất. Các mục nhập chỉ mục chia sẻ cùng một giá trị khóa được sắp xếp theo con trỏ bản ghi.

Điều này là để làm cho chỉ mục có thể duy trì được:nếu bạn xóa một bản ghi có giá trị của một cột được lập chỉ mục được chia sẻ bởi một triệu bản ghi khác, thì bản ghi chỉ mục tương ứng cũng sẽ bị xóa. Nhưng toàn bộ hàng triệu bản ghi chỉ mục không được xem qua:thay vào đó, con trỏ bản ghi được sử dụng như một điều kiện tìm kiếm bổ sung.

Mỗi khóa chỉ mục trên thực tế là duy nhất (ngay cả khi bạn không xác định chỉ mục là duy nhất) và do đó, có số lượng tối đa có thể.

Vì vậy, câu trả lời cho câu hỏi của bạn là:không, số lượng cột không ảnh hưởng đến hiệu suất ghi chỉ mục.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhiều số lượng với các điều kiện khác nhau trong một truy vấn MySQL

  2. Làm thế nào để yêu cầu javascript đợi cho mysql gán giá trị cho biến php?

  3. '𠂉' Không phải là một ký tự unicode hợp lệ, nhưng nằm trong bộ ký tự unicode?

  4. Thả thời gian trong DateTime

  5. Quyền truy cập kết nối bị từ chối đối với dữ liệu www của người dùng