Về việc đánh index và sắp thứ tự column trong database - vozForums
vozForums
Go Back   vozForums > Học tập và công việc > Ngành CNTT > Phát triển Phần mềm
Reply
 
Thread Tools
  #1  
Old 05-06-2018, 09:09
PerHapsYouSeen PerHapsYouSeen is offline
Đã tốn tiền
 
Join Date: 02-2011
Posts: 786

Về việc đánh index và sắp thứ tự column trong database


Chào các bác, mình không rành về database lắm nên có câu hỏi gà mờ cần giải đáp
Đó là về việc đánh index và sắp thứ tự column trong database có ảnh hưởng gì đến tốc độ truy xuất không?
Bữa lang thang có đọc bài viết chia sẻ đại ý là mình nên index các cột thường xuyên tìm kiếm, và dồn hết nó về bên trái.
Thấy cũng có lý, nhưng mà date của bài viết đó đã cách nay 10 năm rồi, mình lăn tăn không biết với những phiên bản mới bây giờ thì 2 cái này có còn đúng và cần thiết nữa không?
(mình xài mariadb)
Reply With Quote
  #2  
Old 05-06-2018, 10:06
Chief Bean's Avatar
Chief Bean Chief Bean is offline
Senior Member
 
Join Date: 12-2009
Posts: 133

->đánh index -> ảnh huởng việc ghi vì khi ghi xuống các columns bị đánh index phải add vào index. Nhưng có db nó có cái concurrent index thì khi insert vào vẫn ok index nó chạy từ từ sau.
-> thứ tự column ko ảnh hưởng nhưng mà indexes có thứ tự như ASC and DESC có ảnh hưởng.

Mariadb chưa xài nên ko rành. Nhưng nếu xét về row oriented db thì đa số như vậy.
Reply With Quote
  #3  
Old 05-06-2018, 12:38
hinh_nd hinh_nd is offline
K.I.A
 
Join Date: 08-2010
Posts: 205

Thì khái niệm index nó vẫn thế thôi, không khác gì đâu.
Nếu câu truy vấn có điều kiện theo cột index, thì thay vì phải duyệt toàn bảng để tìm kiếm thì nó sẽ duyệt trong index và trả luôn ra các row phù hợp (thay vì mở một cuốn sổ đọc và tìm từng trang thì tìm theo mục lục sẽ nhanh hơn).


PS:
- Đánh nhiều index không cần thiết thì lại làm giảm performance như thím trên đã giải thích
- Mà cũng phải tối ưu truy vấn nữa chứ toàn OR với OR thì có khi duyệt còn lâu hơn

Last edited by hinh_nd; 05-06-2018 at 12:40.
Reply With Quote
  #4  
Old 06-06-2018, 08:48
PerHapsYouSeen PerHapsYouSeen is offline
Đã tốn tiền
 
Join Date: 02-2011
Posts: 786

thanks các bác, vậy là nếu thứ tự các cột ko ảnh hưởng gì thì mình sẽ đánh index thêm cho vài cột thôi, khỏi cấu trúc lại table
Reply With Quote
  #5  
Old 06-06-2018, 11:25
Blanic Blanic is offline
Đã tốn tiền
 
Join Date: 08-2013
Posts: 265

Theo mình hiểu thì bạn muốn hỏi:

- Thứ tự columns trong một index. Ví dụ index (a,b,c) và index (a,c,b) có gì khác nhau không? Khả năng bạn đang hỏi cái này, vì đọc đoạn "dồn hết các cột về bên trái".
- Còn các comment trên trả lời là thứ tự columns trong table, không phải trong index.

2 cái này khác hẳn nhau nhé.
Reply With Quote
  #6  
Old 06-06-2018, 14:57
PerHapsYouSeen PerHapsYouSeen is offline
Đã tốn tiền
 
Join Date: 02-2011
Posts: 786

thật ra mình cũng chẳng rõ luôn
vd đơn giản có cái table như vậy đi
Code:
+----------+
| students |
+----------+--------------+
| id       | int          |
| name     | varchar(255) |
| phone    | varchar(255) |
| address  | varchar(255) |
| gender   | bool         |
| birthday | date         |
| class    | int          |
| note     | text         |
+----------+--------------+
3 cột hay dùng để tìm kiếm nhất là id, phone, class
id là khoá chính rồi, tiếp đó mình sẽ đánh index cho 2 cột nữa là phone và class
thế thì 2 cột phone và class này cứ để yên thế hay dời lên ngay sau cột id luôn thì hơn?
và vậy thì id-phone-class hay id-class-phone cũng khác biệt nữa à bác?

Last edited by PerHapsYouSeen; 06-06-2018 at 14:59.
Reply With Quote
  #7  
Old 06-06-2018, 15:49
Truantee Truantee is offline
Senior Member
 
Join Date: 05-2016
Posts: 870

Quote:
Originally Posted by PerHapsYouSeen View Post
thật ra mình cũng chẳng rõ luôn
vd đơn giản có cái table như vậy đi
Code:
+----------+
| students |
+----------+--------------+
| id       | int          |
| name     | varchar(255) |
| phone    | varchar(255) |
| address  | varchar(255) |
| gender   | bool         |
| birthday | date         |
| class    | int          |
| note     | text         |
+----------+--------------+
3 cột hay dùng để tìm kiếm nhất là id, phone, class
id là khoá chính rồi, tiếp đó mình sẽ đánh index cho 2 cột nữa là phone và class
thế thì 2 cột phone và class này cứ để yên thế hay dời lên ngay sau cột id luôn thì hơn?
và vậy thì id-phone-class hay id-class-phone cũng khác biệt nữa à bác?
Gớm, người ta nói là thứ tự khi sắp xếp index (ở đây là nói composite index) chứ liên quan vẹo gì sắp xếp trong field. Sắp trong field thế nào thì cái database nó tự chọn cho thứ tự hợp lý nhất (phụ thuộc theo kiểu dữ liệu của từng field) chứ cậu có đổi lên đổi xuống cũng có được gì đâu?
Reply With Quote
  #8  
Old 06-06-2018, 15:56
Blanic Blanic is offline
Đã tốn tiền
 
Join Date: 08-2013
Posts: 265

"2 cột phone và class này cứ để yên thế hay dời lên ngay sau cột id luôn thì hơn?" ==> Không ảnh hưởng gì.

Trường hợp mình nói là bạn đánh index trên nhiều cột, chứ không phải tạo riêng lẻ index trên từng cột.

Phone và Address không cần đánh Index đâu. Vì chắc bạn sẽ query kiểu LIKE %Value%
Reply With Quote
  #9  
Old 06-06-2018, 16:08
PerHapsYouSeen PerHapsYouSeen is offline
Đã tốn tiền
 
Join Date: 02-2011
Posts: 786

class kiểu nó là int mà

rồi thứ tự index và thứ tự column thông rồi
mấy bác tiện chỉ cho chót luôn đi
giờ trong cái vd này cần index thêm 2 cột (1 int 1 text) thì:
CREATE INDEX phonei ON students (phone)
CREATE INDEX classi ON students (class)
vs
CREATE INDEX studenti ON students (phone, class)
vs
CREATE INDEX studenti ON students (class, phone)
thì cái nào tốt nhất ạ?
(giả sử sau này mình có thể cần index thêm 1-2 cột nữa)
Reply With Quote
  #10  
Old 06-06-2018, 17:39
Truantee Truantee is offline
Senior Member
 
Join Date: 05-2016
Posts: 870

Quote:
Originally Posted by PerHapsYouSeen View Post
class kiểu nó là int mà

rồi thứ tự index và thứ tự column thông rồi
mấy bác tiện chỉ cho chót luôn đi
giờ trong cái vd này cần index thêm 2 cột (1 int 1 text) thì:
CREATE INDEX phonei ON students (phone)
CREATE INDEX classi ON students (class)
vs
CREATE INDEX studenti ON students (phone, class)
vs
CREATE INDEX studenti ON students (class, phone)
thì cái nào tốt nhất ạ?
(giả sử sau này mình có thể cần index thêm 1-2 cột nữa)
index nó thuộc database scope chứ không phải table scope, cho nên đặt tên sao cho nó chuẩn, không trùng lặp, ví dụ students_phone_index thì hợp lý hơn là phonei.

Tiếp nữa thì cái index(phone, class) nó đã chứa sẵn cái index(phone), không cần thiết phải thêm cái nữa (trừ khi là muốn đổi kiểu index, từ btree sang hash chẳng hạn).

index(phone, class) với index(class, phone) gần như tương đương, khác biệt đôi chút là index cho number nó nhanh hơn index cho string một tí cho cùng kiểu btree, cho nên chọn cái field type là number trước thì có vẻ hợp lý hơn

Ttiếp nữa thì index không phải là cứ nhiều là tốt, làm một vài cái hay dùng thôi, chứ có nhiều nữa mà index riêng lẻ thì cái database cũng chọn đúng một cái thôi (trong query phức tạp).


... Mà database mấy triệu rows mà index kinh vậy?
Reply With Quote
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

All times are GMT +7. The time now is 21:55.
Chịu trách nhiệm nội dung: Bạch Thành Trung © 2019 Công ty TNHH Thật Vi Diệu
ĐC tầng 4, số 6-8 Đường D2, Bình Thạnh, Hồ Chí Minh, Việt Nam - SĐT 0981323799 - MST 0313906593
Giấy phép thiết lập MXH số 334/GP-BTTTT, Ký ngày: 19/08/2019