Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Lập chỉ mục (Index) trong Table - Tăng tốc tìm kiếm và sắp xếp dữ liệu
#1
Index là gì?

Chắc các bạn đã khá quen thuộc với khái niệm Index trong CSDL (Database) và Ms Access cũng có đặc tính rất hay này là tạo Index trong Table. Tuy nhiên cũng có nhiều bạn còn mơ hồ về nó nên sẵn đây tôi cũng chia sẻ chút ít hiểu biết của tôi về Index để các bạn tham khảo, bạn nào rành về SQL Server thì biết nó rồi.
Nói nhanh vào vấn đề, lập chỉ mục (Index) cho Table giúp bạn sắp xếp và tìm kiếm dữ liệu được nhanh hơn nhưng ngược lại bạn cũng sẽ đánh đổi chi phí cho nó tức là bạn sẽ phải tốn thêm bộ nhớ cho nó.
Index nó lưu vị trí của bản ghi (Record) trong table dựa theo trường (Field) mà bạn chọn làm chỉ mục và nó lưu trong cùng 1 table sử dụng MyISAM engine. Cái bảng lưu chỉ mục này nó chỉ lưu cái Field được indexed và vị trí con trỏ để trỏ đến record đó mà thôi nên dung lượng sẽ ít hơn cái table gốc chứa toàn bộ các Fields. Chính điều này sẽ làm tăng kích thước table nếu có nhiều trường (Fields) của cùng 1 table được chọn làm Index. Nói nôm na, Index giống như là cái mục lục của cuốn sách vậy. Bạn muốn tìm record nào thì Access nó sẽ đối chiếu, tìm vị trí của record đó trong bảng chỉ mục rồi di chuyển ngay tới vị trí đó trong table để lấy dữ liệu, cách này giúp tiết kiệm thời gian tìm kiếm rất nhiều.
Trên đây tôi có nói tới cái MyISAM engine, nó là bộ máy lưu trữ của Access (Storage Engine). Các bạn tự ngâm cứu nó sau nhé.  007

Index nó ảnh hưởng như thế nào? các trường nào nên lập chỉ mục?

Ví dụ: Khi bạn chạy query cần tìm tất cả thông tin của một người tên “ongke” trong table tblNhanVien.
          SELECT * FROM tblNhanVien WHERE HoTen = ‘ongke’
Khi này, trước tiên Access sẽ kiểm tra xem có chỉ mục nào trong bảng tblNhanVien hay không, nếu có chỉ mục nó sẽ dùng chỉ mục này để di chuyển chính xác đến record có HoTen= ‘ongke’ để lấy dữ liệu, nếu không có index Access sẽ quét qua từng dòng đến cho đến hết toàn bộ bảng tblNhanVien để tìm, nó giống như bạn dùng mắt nhìn, tìm từng dòng dữ liệu trong toàn bộ table vậy (full table scan). Một khi Access phải quét toàn bộ table để tìm record mà bạn yêu cầu thì nó sẽ ảnh hưởng đến tài nguyên máy, đến hiệu suất hoạt động đáng kể như thế nào. Khi có Index, thường thì Access sẽ sắp xếp dữ liệu theo trường được indexed trước, sau đó mới quét, nó sẽ giảm thiểu số record, số dòng cần scan qua trong table để việc tìm kiếm được nhanh hơn.

Bạn có thể tạo index dựa trên một hoặc nhiều trường. 
- Tạo index trên các trường mà bạn thường xuyên tìm kiếm ví dụ như: Họ tên, số CMND…
- Tạo index trên các field mà bạn dự định sort nó.
- Không nên tạo index trên các trường mà có dữ liệu trùng nhau, lập đi lập lại nhiều lần vì nó sẽ tiêu tốn nhiều thời gian hơn khi lưu dữ liệu ở trường này. Nó không hiệu quả vì thời gian bạn query nhanh hơn không bằng thời gian tiêu tốn khi lưu dữ liệu.
- Bạn không thể tạo index trên các Field dạng OLE, attachment hoặc Calculated field.
- Access tự động tạo Index cho khóa chính của bảng (Primary Key).

Chi phí cho việc dùng Index?

- Tốn không gian bộ nhớ: Table càng lớn thì không gian lưu index càng lớn.
- Giảm hiệu năng của hệ thống: khi bạn Thêm, Xóa, Cập nhật dữ liệu của table được Index thì Access cũng phải xây dựng lại cho bảng chỉ mục. Nó phải Thêm, Xóa, Cập nhật ngay cái Field mà bạn vừa hiệu chỉnh trong bảng chi mục để được đồng bộ.

Túm lại:
Chỉ nên tạo index cho trường nào hường xuyên truy vấn trong table.

[Hình: 40111523215_7561da369d_o.png]
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn maidinhdan , tranthanhan1962 , Noname , Minh Tiên
#2
Ngoài vấn đề tìm kiếm giá trị dữ liệu trường. Chỉ mục (Indexed) còn có nhiệm vụ quan trọng. Kiểm tra giá trị trùng và xếp thứ tự. Thực ra, hiện nay gần như nói chỉ quản nhiệm vụ giá trị trùng. Vì đối với nhiệm vụ tăng tốc độ tìm kiếm và xếp thứ tự không còn quan trọng nữa do tốc độ xử lý CPU, dung lượng RAM hiện nay đã là rất lớn so với ngày xưa.
Ngày xưa, cứ kiểm tra trường nào có sử dụng trên query là phải lập chỉ mục (để tăng tốc độ xử lý của query), trường nào không có xử dụng trên query phải bỏ chỉ mục (để không tốn bộ nhớ). Trường nào có khóa chính hoặc khóa ngoại chỉ sử dụng tối đa 7 ký tự, không dấu để xử lý nhanh query nhiều table. Tạo form muốn trang trỉ ảnh cũng kiếm cái ảnh nào nhẹ nhẹ... Vì ngày đó CPU chỉ có 100-200 Mhz, RAM 512 Mb (633)  là đã ngon lắm rồi. Còn bây giờ thì bèo bèo cũng core i3 3(Ghz - 4Ghz x 2), RAM tệ lắm cũng 2 Gb (1200).
Giờ thì vấn đề quan trọng là đường truyền, băng thông khi xử lý phần mềm mạng. Đa số các bạn sợ đặt back end trên google drive vì sợ nó chậm. Thực ra cứ cab quang 16 M trở lên thì tốc độ xử lý không thua gì mạng LAN, Google driver đồng bộ lập tức chẳng trở ngại gì (với điều kiện nhà mạng không chơi ăn gian)  004
Cũng có những máy khủng chạy rề rề như rùa leo dốc. Nhưng thực ra không phải do phần mềm mà do phần cứng, ổ đĩa bị bad, bị phân mãnh, hoặc cab ổ cứng bị lỏng, tiếp xúc không tốt.
Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn  thumbs up
ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , ongke0711 , Minh Tiên
#3
(26-03-18, 12:59 AM)tranthanhan1962 Đã viết: Giờ thì vấn đề quan trọng là đường truyền, băng thông khi xử lý phần mềm mạng. Đa số các bạn sợ đặt back end trên google drive vì sợ nó chậm. Thực ra cứ cab quang 16 M trở lên thì tốc độ xử lý không thua gì mạng LAN, Google driver đồng bộ lập tức chẳng trở ngại gì (với điều kiện nhà mạng không chơi ăn gian)  004
Cũng có những máy khủng chạy rề rề như rùa leo dốc. Nhưng thực ra không phải do phần mềm mà do phần cứng, ổ đĩa bị bad, bị phân mãnh, hoặc cab ổ cứng bị lỏng, tiếp xúc không tốt.

Sẳn hỏi anh vụ anh dùng Google Drive và các trường hợp có thể xảy ra khi dùng.
- Khi dùng Google Drive thì máy con cũng tự động tạo 1 folder "Google Drive" dùng để lưu các file đồng bộ lên ổ Google Drive trên mạng. Vậy các máy con cũng phải lưu 1 file back end trong folder này rồi khi có thay đổi dữ liệu (nhập liệu trong form FE) thì Google Drive sẽ tự động đồng bộ lên ổ mạng, sau đó sẽ đồng bộ về folder "Google Drive" ở các máy con khác đúng vậy không anh Ân?
- Nếu vậy sẽ có trường hợp 2 máy cùng sửa được 1 record vì không thể dùng Record Lock (vì file BE ở riêng từng máy con). Khi đó máy nào đồng bộ sau sẽ lưu đè lên file BE trên ổ mạng?

Nói chung vì không có máy mạng nội bộ để test nên hỏi kinh nghiệm dùng rồi của anh để nắm về mặt lý thuyết trước đã.. 014
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#4
(26-03-18, 12:19 PM)ongke0711 Đã viết: Sẳn hỏi anh vụ anh dùng Google Drive và các trường hợp có thể xảy ra khi dùng.
- Khi dùng Google Drive thì máy con cũng tự động tạo 1 folder "Google Drive" dùng để lưu các file đồng bộ lên ổ Google Drive trên mạng. Vậy các máy con cũng phải lưu 1 file back end trong folder này rồi khi có thay đổi dữ liệu (nhập liệu trong form FE) thì Google Drive sẽ tự động đồng bộ lên ổ mạng, sau đó sẽ đồng bộ về folder "Google Drive" ở các máy con khác đúng vậy không anh Ân?
- Nếu vậy sẽ có trường hợp 2 máy cùng sửa được 1 record vì không thể dùng Record Lock (vì file BE ở riêng từng máy con). Khi đó máy nào đồng bộ sau sẽ lưu đè lên file BE trên ổ mạng?

Nói chung vì không có máy mạng nội bộ để test nên hỏi kinh nghiệm dùng rồi của anh để nắm về mặt lý thuyết trước đã.. 014
Nói chung sử dụng BE - FE thì điều đáng sợ nhất là xung đột dữ liệu. Trên mạng LAN, sự kiện này xảy ra khi từ 2 FE trở lên cùng truy câp 1 record, điều này sẽ không xảy ra với việc dùng Google driver chứa BE, vì mỗi FE có một BE trên máy và đồng bộ khi thông mạng (giống như Replication của access 2003 hoặc Briefcase của windows), tất nhiên máy nào đồng bộ sẽ cập nhật phần giá trị thay đổi dữ liệu so với bản gốc (chứ không phải cả file đâu nhé - Ví dụ BE1 có 3 thay đổi, BA2 có 5 thay đổi => sau khi đồng bộ BE chính sẽ có 8 thay đổi chứ nếu lưu đè cả file thì BA gốc sau khi đồng bộ với BE1 thì biến thành BE1, đồng bộ với BE2 thì biến thành BE2 và sẽ mất dữ liệu BE1) lên file BE chính (mà ở đây là tâp tin BE trên đám mây Google Driver). Trong trường hợp này vấn đề hàng đầu giải quyết xử lý trường hợp giá trị trường khóa chính bị trùng (mỗi FE có giá trị trường khóa chính kèm ký hiệu khác nhau - Nếu ai đã từng sử dụng Replication hoặc Briefcase sẽ có kinh nghiệm về việc này). Còn về sửa dữ liệu thì có thể xử lý FE nào chỉ có thể sửa giá trị của FE đó để không thể có việc 2 front end cùng sửa một record. Còn FE của admin chỉ sửa dữ liệu cuối tháng hoặc cuối kỳ (tức là khi các FE user đã hết quyền sửa chữa của kỳ đó). Lúc mới ra đời Google driver chỉ tạo một khu vực đồng bộ muốn đồng bộ thì phải thả BE của từng máy con vào giống như thư mục Briefcase của windows, bây giờ cải tiến đưa vào google driver vào user máy thuận tiện hơn.
Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn  thumbs up
ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn ongke0711 , maidinhdan , Minh Tiên
#5
Chào mọi người,
Mình mới làm quen với access có mấy vấn đề không biết hỏi ở đâu đành vào tạm topic này hỏi vậy mong được mọi người giúp đỡ:
Tình hình là mình có một trường Field1 của một bảng nó là giá trị nhập vào nó là một list box được lookup từ một trường của một bảng khác.
Khi nhập giá trị vào thì nó có tính năng gợi ý từ rất hay, ví dụ: nhập vào từ "nguyễn" nó sẽ hiện các bản ghi có nội dung "Nguyễn....", tuy nhiên nó chỉ hiện các bản ghi với "nguyễn..." ở đầu, còn các bản ghi với "nguyễn" ở giữa hoặc ở sau chẳng hạn thì nó không tìm và gợi ý được,
À, với là mang tiếng là cơ sở dữ liệu chứa thông tin mà việc thay đổi thông tin trong access dễ gây nhầm lẫn quá, khi thay đổi dữ liệu một bản ghi sau khi thay đổi xong tắt đi thì nó tắt luôn không cần hỏi xác nhận nữa, nhiều khi làm bị đè bàn phím nó ghi vô mấy bản ghi không nhớ dữ liệu cũ là gì, undo thì không được, tắt thì nó không thèm hỏi, vậy là nó ghi nhận mình sữa dữ liệu luôn, hic
Mong mọi người có ai đã dùng mà bị khó khăn như vậy với access không giúp đỡ với ạ
Chữ ký của nhat quy nhat quy,gia nhập Thủ Thuật Access từ 11-07 -17.
Reply
Những người đã cảm ơn
#6
List box hoặc combobox trong access hỗ trợ gợi ý từ theo thứ tự ký tự. Bạn muốn tìm gợi ý tất cả các vị trí thì có thể dùng form lọc theo một textbox thay listbox và viết code đề xử lý. Ví dụ: trên textbox A có giá trị là  "Nguyễn". Form sẽ lọc "*" & "Nguyễn" & "*". Bạn viết code chọn giá trị trong form nó sẽ điền giá trị vào texbox của bạn.
Access tự động refresh dữ liệu nên khi bạn thêm record thay đổi dữ liệu trên record và rời khỏi record đó nó sẽ OK luôn nếu các giá trị không bị lỗi. Bạn có thể xử lý bằng cách viết thêm code để nó báo lỗi khi thực hiện công việc. Bạn có thể undo khi chưa rời khỏi record bằng phím ESC, Nhưng nếu đã rời khỏi record rồi thì hết cách  040
Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn  thumbs up
ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Hỏi] lấy dữ liệu từ query sang Text box minhminh25767 3 136 13-11-18, 04:01 PM
Bài mới nhất: ongke0711
Photo [Lỗi] Không lấy được data table vunamnet 9 492 03-11-18, 03:57 PM
Bài mới nhất: vunamnet
Lightbulb [Hỏi] Cách tạo Table/Query từ nhiều Table/Query khác shinichikuto 16 1,340 30-08-18, 03:36 PM
Bài mới nhất: shinichikuto
  Xin hỏi cách so sánh để nâng cấp dữ liệu ledangvan 23 1,746 24-08-18, 11:37 AM
Bài mới nhất: tranthanhan1962
  [Lỗi] Lỗi mất dự liệu trong table thanhtruong 3 379 08-08-18, 02:52 PM
Bài mới nhất: Xuân Thanh

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line