Selectivity trong sql
Bài đăng này đã không được cập nhật trong 7 năm
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ớiSelectivity
. 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 tableEmployee
với columnsex
, cột này chỉ có thể có 2 giá trị làMale
vàFemale
, như vậycardinality
cho columnsex
sẽ là 2, vì ta chỉ có 2 giá trị duy nhất xuất hiện ở cột columnnumber 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 columnsex
. Để 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/
All rights reserved