MySql: Có nên sử Index? Khi nào thì nên sử dụng Index?

Với tiêu đề trên bạn nào không làm việc với MySQL nhiều sẽ thấy nực cười. Tất nhiên là nên sử dụng index rồi, test với một số dòng nhất định thì thấy lý thuyết mình học được trên trường đúng quá. Ngay cả mình cũng vậy bao nhiêu năm lúc nào cũng đinh ninh là cứ oánh index là khi select kiểu gì cũng nhanh hơn. Nhưng gần đây website của mình sinh ra một table tới 60 triệu dòng, khá là lớn, thấy hệ thống châm quá nên cặm cụi debug xem thế nào, bắt đầu từ MySQL, explain xem mấy câu query chạy chậm quá, thế là lên hỏi pác google rồi thấy sự thực đau lòng, select chậm một phần là do mình oánh index híc. Nếu bạn cứ thử test với table nào của mình có nhiều dòng một chút sẽ thấy ngay. Lý do là ở đâu, nếu bạn oánh index 1 column, nhưng số giá trị unique trong column đó quá thấp thì bạn không nên dùng index đối với trường hợp này. bạn có thể tính điều này qua công thức

Độ hiệu quả = tổng số dòng trong tables) / (tổng số dòng unique trong column) 

=1 Quá tốt, sự khác nhau của mỗi dòng là rất nhiều bà BTree hoạt động rất tốt, bạn nên dùng index

+———-+

| count(*) |
+----------+
| 817666 |
+----------+
1 row in set (0.63 sec)

+--------------------------+
| count(distinct username) |
+--------------------------+
| 817666 |
+--------------------------+
1 row in set (1.63 sec)

 

Nhưng nếu trong trường hợp tổng giá trị distinct của bạn quá ít so với số dòng của table giống vd dưới thì bạn không nên dùng index trong trường hợp này

+---------------------+
| count(distinct age) |
+---------------------+
| 83 |
+---------------------+
1 row in set (0.63 sec)

Chỉ có 83 sự khác biệt trong column trên => theo công thức trên Độ hiệu quả = 0.000101508 => gần như bằng 0 => nếu dùng index sẽ chậm hơn là quét toàn table rất nhiều => không nên dùng index trong trường hợp này
Advertisements

One thought on “MySql: Có nên sử Index? Khi nào thì nên sử dụng Index?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s