12/08/2018, 15:32

Selectivity trong sql

Selectivity trong sql là cái gì ? Có lẽ thuật ngữ Selectivity hơi lạ, nhưng nó có liên quan tới việc sử dụng index trong databases. Bạn đã từng băn khoăn xem có nên đánh index cho một column nào đó trong một table nào đó chưa. Nếu đã từng thì bạn nên biết tới thuật ngữ này, nó có công thức để ...

Selectivity trong sql là cái gì ?

Có lẽ thuật ngữ Selectivity hơi lạ, nhưng nó có liên quan tới việc sử dụng index trong databases. Bạn đã từng băn khoăn xem có nên đánh index cho một column nào đó trong một table nào đó chưa. Nếu đã từng thì bạn nên biết tới thuật ngữ này, nó có công thức để tính đấy

Selectivity of index = cardinality/(number of records) * 100%
  • cardinality: cũng là một thuật ngữ liên quan mật thiết tới Selectivity. Có thể hiểu đơn giản, cardinality ở đây là số lượng bản ghi duy nhất xuất hiện trong table cho column đó. Ví dụ: chúng ta có một table Employee với column sex, cột này chỉ có thể có 2 giá trị là Male và Female, như vậy cardinality cho column sex sẽ là 2, vì ta chỉ có 2 giá trị duy nhất xuất hiện ở cột column
  • number of records: số lượng records tương ứng với số row trong table.

Vì sao chúng ta lại có công thức này. Có lẽ ta nên tìm hiểu thêm về ý nghĩa của Selectivity

Selectivity nghĩa là gì ?

Giả sử ta có một Table M::Employee:

  • column sex chỉ có 2 giá trị Male và Female => cardinality = 2
  • số lượng records = 10.000

=> Selectivity = 2 / 10.000 * 100% = 0.02 %

Giá trị của Selectivity được đo bằng cách chọn lọc các giá trị trong một column nhất định, tức là có bao nhiêu giá trị khác nhau có trong tập mẫu được đưa ra. Giá trị 0.02% là một giá trị thấp, nghĩa là so với số lượng row thì số lượng biến thể cho column rất nhỏ.

Nhưng giá trị này có ý nghĩa gì với database và việc đánh index ?

Đơn giản là vì việc tối ưu hóa query trong database sẽ phải quyết định việc sử dụng các index để tìm kiếm các row trong table hoặc là không cần sử dụng. Bởi vì, có những lần khi sử dụng index sẽ ít hiệu quả hơn so với việc quét trực tiếp table. Giá trị Selectivity sẽ quyết định việc optimize query có sử dụng index hay là không ?

Vậy khi nào nó không sử dụng index trong query ?

Câu trả lời là khi giá trị của Selectivity thấp. Vì sao lại thế ? Giả sử chúng ta muốn query tất cả Female trong Table, và tỉ lệ Female trong Table là 50%.

  • Cách 1: sử dụng index cho column sex => Chúng ta sẽ có tất cả 5.000 index cho column sex. Để tìm được Female, ta cần truy cập vào index 5.000 lần
  • Cách 2: không sử dụng index => Chúng ta sẽ quét toàn bộ table

Trong thực tế, việc truy cập vào index cần nhiều thời gian và tiêu tốn tài nguyên hơn so với việc truy cập vào Table. Vị vậy nếu số lượng truy cập vào index quá lớn thì nó sẽ không thực sự mang lại hiệu quả truy vấn. Tốc độ query có thể sẽ không tăng lên vì thế việc sử dụng index là không cần thiết. Hơn nữa, trong nhiều trường hợp nó sẽ khiến việc truy vấn bị chậm đi.

Vậy khi nào nên sử dụng index trong query

Thật khó để nói chính xác giá trị Selectivity nào thì nên sử dụng index. Nhưng tất nhiên nếu chúng ta thấy giá trị Selectivity càng cao thì càng nên sử dụng index. Ta lấy ví dụ với Selectivity bằng 100%, điều này có nghĩa là tất cả các giá trị trong column đều là duy nhất, tức là nếu một query tìm kiếm một giá trị trong số đó thì sẽ chỉ cần tìm 1 index mà thôi, việc này tất nhiên sẽ hiệu quả hơn nhiều so với việc quét toàn bộ Table.

Tham khảo

http://www.programmerinterview.com/index.php/database-sql/selectivity-in-sql-databases/

0