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

Tại sao bản chất của một chỉ mục trong MySQL vẫn không thay đổi khi tôi thêm một chỉ mục mới?

Nếu bạn chỉ có 1 hàng trong bảng, tất nhiên, bản số của chỉ mục phải là 1. Nó chỉ đếm số lượng giá trị duy nhất.

Nếu bạn coi chỉ mục là một bảng tra cứu dựa trên các nhóm (như một hàm băm), thì bản số chính là số nhóm.

Đây là cách nó hoạt động:Khi bạn tạo chỉ mục trên một tập hợp các cột (a,b,c,d) , sau đó cơ sở dữ liệu đi qua tất cả các hàng trong bảng, xem xét các phần tư có thứ tự của 4 cột đó, cho mỗi hàng. Giả sử bảng của bạn trông như thế này:

a  b  c  d  e   
-- -- -- -- --  
1  1  1  1  200 
1  1  1  1  300
1  2  1  1  200
1  3  1  1  200

Vì vậy, những gì cơ sở dữ liệu nhìn vào chỉ là 4 cột (a, b, c, d):

a  b  c  d  
-- -- -- --
1  1  1  1 
1  2  1  1 
1  3  1  1 

Thấy rằng chỉ còn lại 3 hàng duy nhất? Những thứ đó sẽ trở thành nhóm của chúng ta, nhưng chúng ta sẽ quay lại với điều đó. Trong thực tế, cũng có một id bản ghi hoặc định danh hàng cho mỗi hàng trong bảng. Vì vậy, bảng ban đầu của chúng tôi trông giống như sau:

(row id) a  b  c  d  e   
-------- -- -- -- -- --  
00000001 1  1  1  1  200 
00000002 1  1  1  1  300
00000003 1  2  1  1  200
00000004 1  3  1  1  200

Vì vậy, khi chúng tôi chỉ xem xét 4 cột của (a, b, c, d), chúng tôi thực sự đang xem xét id hàng:

(row id) a  b  c  d 
-------- -- -- -- --
00000001 1  1  1  1
00000002 1  1  1  1
00000003 1  2  1  1
00000004 1  3  1  1

Nhưng chúng tôi muốn thực hiện tra cứu theo (a, b, c, d) chứ không phải theo id hàng, vì vậy chúng tôi tạo ra một cái gì đó như sau:

(a,b,c,d) (row id)
--------- --------
1,1,1,1   00000001
1,1,1,1   00000002
1,2,1,1   00000003
1,3,1,1   00000004

Và cuối cùng, chúng tôi nhóm tất cả id hàng của các hàng có giá trị đồng nhất (a, b, c, d) với nhau:

(a,b,c,d) (row id)
--------- ---------------------
1,1,1,1   00000001 and 00000002
1,2,1,1   00000003
1,3,1,1   00000004

Thấy chưa? Các giá trị của (a, b, c, d), là (1,1,1,1) (1,2,1,1) và (1,3,1,1) đã trở thành khóa cho bảng tra cứu của chúng tôi vào các hàng của bảng gốc.

Trên thực tế, không có điều nào trong số này thực sự xảy ra, nhưng nó sẽ cung cấp cho bạn một ý tưởng hay về cách triển khai một chỉ mục "ngây thơ" (tức là nói thẳng) có thể được thực hiện.

Nhưng điểm mấu chốt ở đây là:cardinality chỉ đo lường số lượng hàng duy nhất có trong một chỉ mục. Và trong ví dụ của chúng tôi, đó là số lượng khóa trong bảng tra cứu của chúng tôi, là 3.

Hy vọng điều đó sẽ hữu ích!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. truy vấn mysql để cập nhật trường thành max (trường) + 1

  2. Làm cách nào để định cấu hình Rails cho quyền truy cập không cần mật khẩu vào cơ sở dữ liệu từ xa

  3. Tạo đối tượng Ngày trong PHP cho các ngày trước năm 1970 ở định dạng nhất định

  4. Vấn đề hiệu suất và giải pháp mysql order by rand ()

  5. Kiểm tra xem bảng MySQL có tồn tại hay không