HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA CÔNG NGHỆ THÔNG TIN
ĐỀ TÀI THỰC TẬP CƠ SỞ
AN TOÀN VÀ BẢO MẬT
HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
SQLITE
Cán bộ hướng dẫn: Thầy Phạm Văn Hưởng
Sinh viên thực hiện:
-
Nguyễn Quyết Thắng
Phạm Thị Nguyệt
Nguyễn Hữu Tú
Lớp: AT10D
HÀ NỘI 2016
HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA CÔNG NGHỆ THÔNG TIN
ĐỀ TÀI THỰC TẬP CƠ SỞ
AN TOÀN VÀ BẢO MẬT
HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
SQLITE
Nhận xét của cán bộ hướng dẫn:.........................................................................................
.............................................................................................................................................
.............................................................................................................................................
.............................................................................................................................................
.............................................................................................................................................
Điểm chuyên cần:..................................................................................................................
Điểm xác nhận:.......................................................................................................................
Xác nhận của cán bộ hướng dẫn
Mục lục
DANH MỤC HÌNH ẢNH
DANH MỤC BẢNG BIỂU
LỜI NÓI ĐẦU
Ngày nay, khoa học công nghệ ngày càng phát triển làm cho nhu cầu sử dụng các
ứng dụng phần mềm tăng lên kéo theo nhu cầu lưu trữ dữ liệu ngày càng lớn. Vấn đề lựa
chọn hệ quản trị CSDL để tối ưu hoá việc lưu trữ dữ liệu đã và đang là vấn đề được các nhà
phát triển cân nhắc và nghiên cứu. Việc lựa chọn một hệ quản trị cơ sở dữ liệu để đáp ứng
các yêu cầu về lưu trữ dữ liệu cần thoả mãn một số yêu cầu như: là cơ sở dữ liệu nhúng,
dung lượng nhỏ, thiết kế và cài đặt đơn giản, dễ thao tác là vấn đề mà các nhà phát triển
hướng tới.
Hệ quản trị cơ sở dữ liệu Sqlite với một số ưu điểm đã được các nhà phát triển hệ
điều hành chọn làm hệ quản trị cơ sở dữ liệu để lưu dữ liệu trong ứng dụng. Hệ quản trị cơ
sở dữ liệu Sqlite cũng tương tự như MySql, PostgreSql, nó được biết đến là một hệ quản trị
cơ sở dữ liệu quan hệ nhỏ gọn, hoàn chỉnh có thể cài đặt bên trong các ứng dụng hay còn
gọi là hệ quản trị cơ sở dữ liệu nhúng. Hệ quản trị này được Richard Hipp viết dưới dạng
thư viện bằng ngôn ngữ lập trình C. Với một số ưu điểm như tệp tin cơ sở dữ liệu duy nhất,
dung lượng chưa đến 350Kb được nhúng trong ứng dụng mà không cần cấu hình và cài đặt.
Sqlite còn thực hiện các thao tác đơn giản nhanh hơn các hệ thống cơ sở dữ liệu khách / chủ
khác. Ngoài ra, tốc độ thực thi của Sqlite nhanh và hiệu suất thường là khá tốt ngay cả hoạt
động trong môi trường bộ nhớ thấp. Với một số đặc điểm được nêu ra, hệ quản trị cơ sở dữ
liệu Sqlite đã khẳng định được ưu thế và được các nhà phát triển chọn để giải quyết các vấn
đề dung lượng bộ nhớ và lưu trữ dữ liệu.
Mục tiêu mà đề tài muốn trình bày là tổng quan về hệ quản trị cơ sở dữ liệu để từ đó có
nền tảng để tìm hiểu kỹ hơn về cơ sở dữ liệu Sqlite và vận dụng để thiết lập an toàn và bảo
mật trong hệ quản trị này.
Chúng em xin được gửi lời cảm ơn tới thầy Phạm Văn Hưởng đã hướng dẫn tận tình
giúp chúng em thực hiện đề tài này.
Trong quá trình thực hiện còn nhiều sai sót rất mong nhận được sự đóng góp ý kiến từ
thầy cô và các bạn.
Chương 1. Tổng quan về hệ quản trị cơ sở dữ liệu SQLite
1.1
Giới thiệu chung về hệ quản trị cơ sở dữ liệu SQLite
Hệ quản trị CSDL Sqlite ra đời giải quyết được vấn đề lưu trữ dữ liệu trong các
ứng dụng cần hệ quản trị CSDL nhúng. Sqlite là mã nguồn mở, được phát hành vào năm
2000. Với một số đặc điểm như linh động, dễ sử dụng, nhỏ gọn, hiệu quả và tính tin cậy
cao thì Sqlite được đánh giá là một hệ quản trị CSDL tốt. Vậy hệ quản trị CSDL Sqlite là
gì? Nó đã được phát triển như thế nào? Hệ quản trị CSDL Sqlite có những ưu nhược
điểm gì và các nhà phát triển, nhà quản trị đã đánh giá về nó ra sao? Hay các đặc điểm
của Sqlite sẽ được làm rõ trong chương này.
1.1.1
Khái niệm
Sqlite là mã nguồn mở, là CSDL nhúng. Sqlite được phát hành năm 2000 là thư
viện điều khiển thực thi độc lập, không cấu hình. Mã nguồn của Sqlite được công khai và
sử dụng miễn phí cho bất kỳ mục đích sử dụng nào. Nó được thiết kế để cung cấp những
phương pháp thích hợp cho ứng dụng để quản lý dữ liệu mà không cần chi phí quản lý
thường thấy ở những hệ thống quản trị CSDL quan hệ chuyên dụng.
Hình 1. Logo của hệ quản trị CSDL Sqlite
1.1.2
Khả năng nhúng
Sqlite là một kiểu CSDL nhúng, nó được nhúng vào ứng dụng và đảm nhiệm
luôn vai trò làm máy chủ quản lý dữ liệu. Mã của Sqlite được nhúng cùng mã của
chương trình, và mã đó sẽ được biên dịch cùng với các đoạn mã khác của chương trình.
Sqlite thực thi mà không phụ thuộc vào các yếu tố như cấu hình CSDL, kết nối mạng,
yêu cầu tên người dùng hay mật khẩu nên Sqlite rất dễ dàng được sử dụng như một
chương trình hỗ trợ lưu dữ liệu trong ứng dụng. Khi chương trình được cài lên thiết bị,
nếu thiết bị không có kết nối mạng thì việc kết nối dữ liệu cũng không bị ảnh hưởng,
chương trình vẫn có thể hoạt động tốt. Ngoài ra, tập tin CSDL Sqlite chỉ là một tập tin
duy nhất, nhỏ gọn được nhúng bên trong ứng dụng. Tất cả dữ liệu của ứng dụng được
lưu trữ trong tập tin này và các thao tác với dữ liệu như chèn, sửa, xoá, tìm kiếm có thể
được thực hiện thông qua các chức năng của ứng dụng. Cả ứng dụng và máy chủ đều
chạy với nhau trong cùng một quá trình nên làm giảm chi phí liên quan như kết nối
mạng, đơn giản hoá việc quản lý CSDL và dễ dàng hơn cho việc triển khai ứng dụng.
Thông thường, những ứng dụng chạy trên thiết bị di động, CSDL sẽ được nhúng
trong ứng dụng. Đầu ra của các chương trình đó là một ứng dụng bao gồm chức năng và
CSDL được nhúng trong nó. Những ứng dụng này thường được bán trên các chợ công
nghệ như App Store, Google Play, Window Store, và nhà phát triển thường có xu hướng
là bán ứng dụng mà không muốn mất nhiều chi phí bảo trì và quản lý dữ liệu. Do đó các
nhà phát triển thường chọn theo hướng đóng gói chương trình bao đã chứa CSDL.
Hình 2. Quá trình nhúng Sqlite trong máy chủ
1.1.3
Sqlite là CSDL của nhà phát triển
Đối với nhà phát triển ứng dụng, Sqlite là hệ quản trị CSDL linh hoạt. Sqlite
được biết đến như là một CSDL, là thư viện lập trình và là công cụ dòng lệnh rất dễ sử
dụng. Do đó, Sqlite có thể được coi là một công cụ học rất tốt cung cấp sự mở đầu tốt
những hiểu biết về CSDL. Có nhiều cách sử dụng Sqlite như: môi trường nhúng,
website, dịch vụ hoạt động hệ thống, các tập lệnh, và ứng dụng. Ngoài ra, với một số lý
do như: không có hệ quản trị CSDL bên ngoài hoặc không cấu hình mạng hoặc không
cần tên người dùng và mật khẩu nên Sqlite là CSDL tốt cho việc phát triển và kiểm thử.
Bên cạnh chức năng nổi trội nhất là lưu trữ dữ liệu, Sqlite còn cung cấp các công
cụ chức năng để phục vụ cho việc xử lý dữ liệu chung. Tuỳ thuộc vào kích thước và độ
phức tạp, Sqlite có thể dễ dàng biểu diễn một số cấu trúc dữ liệu ứng dụng như một bảng
hoặc nhiều bảng trong CSDL. Người dùng vẫn có thể thực hiện các truy vấn với dữ liệu
như các CSDL khác.
Với các lập trình viên lập trình ứng dụng cho điện thoại di động cài hệ điều hành
iPhone hoặc Android, việc sử dụng Sqlite cũng đơn giản trong việc tạo ra CSDL, nhúng
CSDL vào ứng dụng và việc xử lý dữ liệu chung. Để tạo ra CSDL, nhà phát triển ứng
dụng có thể dùng công cụ Sqlite Manager hoặc công cụ dòng lệnh. Những công cụ trên
rất dễ dàng cài đặt, không quá phức tạp ví dụ như Sqlite Manager được tích hợp sẵn
trong Firefox, còn công cụ dòng lệnh cũng đã được hỗ trợ trong hệ điều hành OS X.
1.1.4 Sqlite đối với nhà quản trị
Sqlite không chỉ là CSDL của nhà phát triển mà Sqlite còn là công cụ hữu ích cho
các nhà quản trị hệ thống. Sqlite nhỏ gọn, nó có dịch vụ dòng lệnh có thể sử dụng từ
shell hoặc dòng lệnh. Trong hệ điều hành OS X, người quản trị có thể dễ dàng thao tác
với CSDL Sqlite bằng công cụ Terminal đã được tích hợp sẵn trong hệ điều hành.
Sqlite cũng là một công cụ tốt cho quản trị viên tìm hiểu thêm về CSDL. Sqlite
cài đặt nhanh và dễ dàng trên bất kỳ nền tảng nào, và các tập tin CSDL chia sẻ miễn phí
với nhau mà không cần chuyển đổi định dạng. Sqlite có đầy đủ các chức năng nhưng
không quá phức tạp trong việc tìm hiểu.
Nói tóm lại, với những đặc điểm như nhỏ gọn, dễ dàng thao tác trên nhiều môi
trường công cụ hay việc chia sẻ dữ liệu thì Sqlite là công cụ tốt cho cả nhà phát triển và
nhà quản trị dữ liệu.
1.2
Các đặc trưng của hệ quản trị CSDL Sqlite
Sqlite tuy là một CSDL nhỏ, nhưng nó cung cấp đầy đủ các tính năng và khả
năng mà một hệ quản trị CSDL có. Sqlite hỗ trợ tập hợp các chức năng cơ bản như
giao tác, khung nhìn, kiểm tra ràng buộc, truy vấn con liên quan và các truy vấn kết
hợp cùng với nhiều tính năng khác trong CSDL như bộ kích hoạt, chỉ mục, tăng tự
động chỉ số của cột, các câu lệnh LIMIT/OFFSET. Nó cũng có nhiều chức năng đặc
biệt như CSDL bộ nhớ trong, gán kiểu động, và giải quyết một số xung đột. Dưới dây
là một số các tính năng đặc trưng được mở rộng trong hệ quản trị CSDL Sqlite [7].
1.2.1
Không cần cấu hình
Như đã đề cập ở các phần trên, Sqlite được thiết kế mà có thể không cần quản trị
viên của hệ thống. Việc cấu hình và quản lý Sqlite rất đơn giản, nó đã bao gồm đầy đủ
các chức năng được cấu hình trong hệ thống, người dùng không cần can thiệp vào bên
trong nó mà vẫn có thể dùng như một hệ thống hoàn chỉnh.
1.2.2 Tính di động,khả chuyển
Sqlite được thiết kế đặc biệt với khả năng di động của nó. Sqlite có thể biên dịch
và chạy trên nhiều hệ điều hành như Windows, Linux, BSD, OS X, hệ điều hành Unix
như Solaris, HPUX và AIX, cũng như nhiều nền tảng nhúng như QNX, VxWorks,
Symbian, Palm OS và Window CE. Nó còn có thể hoạt động tốt trên các kiến trúc bản
16, 32 và 64 bit với các thứ tự byte lớn nhỏ. Tính di động không chỉ dừng lại với phần
mềm mà các tập tin CSDL Sqlite cũng có khả năng di động. Các định dạng tập tin
CSDL là định dạng nhị phân, chúng tương thích trên tất cả các hệ điều hành, kiến trúc
phần cứng và thứ tự byte mà Sqlite có thể hoạt động được. Người dùng có thể tạo
CSDL Sqlite trên rất nhiều công cụ và sử dụng các hệ điều hành hay thiết bị, ngay cả
trên điện thoại di động mà không cần bất kỳ sự chuyển đổi hay sửa đổi nào. Hơn nữa,
CSDL Sqlite có thể chứa tới 2 terabyte dữ liệu và hỗ trợ 2 kiểu mã hoá UTF-8 và UTF16.
Hình 3. Sqlite trên window
Hình 4. Sqilte trên Ubuntu
Dung lượng và thời gian chạy của Sqlite trên một số hệ điều hành tiêu biểu được
liệt kê trong bảng 2.1[19].
OS
Cài đặt tối ƣu
Kích thƣớc (bytes)
Thời gian chạy
Linux 10.1
GCC 4.1.0
Sqlite 3.7.8
X86 (32-bit)
-O0
-O1
-Os
-O2
-O3
-O0
529765
397204
333059
418161
828602
625841
1.00
0.71
0.73
0.68
0.66
1.00
Ubuntu
GCC 4.5.2
Sqlite 3.7.8
X86_64 (64bit)
Max OS 10.7.1
GCC 4.2.1 +
LLVM
Sqlite 3.7.8
X86_64 (64-bit)
-O1
-Os
-O2
-O3
-O0
-O1
-Os
-O2
-O3
455072
404201
499543
678465
806598
508500
481816
614346
661622
0.62
0.59
0.53
0.54
1.00
0.61
0.57
0.55
0.55
Bảng 1. Kích thước và thời gian chạy của Sqlite trên một số hệ điều hành
1.2.3
Tính nhỏ gọn
Sqlite được thiết kế nhẹ và khép kín; một tập tin tiêu đề, một thư viện và không
yêu cầu CSDL bên ngoài. Tất cả mọi đối tượng được đóng gói, dung lượng nhỏ hơn một
nửa megabyte. Ngoài ra, tập tin CSDL Sqlite cũng nhỏ gọn, chúng là những tập tin hệ
thống thông thường. Với bất kỳ hệ thống nào thì tất cả các đối tượng trong CSDL như
bảng, bộ kích hoạt, lược đồ, chỉ mục và khung nhìn đều được chứa trong một tập tin
CSDL duy nhất. Hơn nữa, Sqlite dử dụng các bản ghi có chiều dài có thể thay đổi, việc
cấp phát bộ nhớ chỉ cần một dung lượng tối hiểu để Sqlite lưu giữ các trường.
1.2.4 Tính đơn giản
Hình 5. Dung lượng tập tin CSDL Sqlite
Như một thư viện lập trình, API của Sqlite là một trong những giao diện lập trình
ứng dụng đơn giản và dễ sử dụng. API được thiết kế giúp người dùng có thể tuỳ chọn
Sqlite bằng nhiều cách, chẳng hạn như thực hiện các chức năng do người dùng mở rộng
bằng ngôn ngữ C. Hơn thế nữa, có nhiều thư viện giao diện và nhiều ngôn ngữ có thể sử
dụng được CSDL Sqlite Perl, Python, Ruby, Tcl/Tk, Java, PHP, Visual Basic, Objective
C... Việc thiết kế các thư viện giao diện cho phép Sqlite có đầy đủ các chức năng và mở
rộng khi mà mã nguồn của chúng không phức tạp và vẫn đơn giản. Mỗi khối của hệ
thống chuyên xử lý một nhiệm vụ cụ thể. Những khối này giúp cho Sqlite có thể dễ dàng
phát triển và gỡ lỗi mà không phụ thuộc vào hệ thống. Kết quả của những công việc đó
giúp Sqlite có thể tách biệt rõ ràng giữa front-end (trình biên dịch SQL) và back-end (hệ
thống lưu trữ) cho phép 2 thành phần này độc lập nhau. Tóm lại, việc thiết kế API rõ
ràng trong cả tài liệu giao diện, việc phân chia các khối và thành phần riêng biệt, không
có sự ràng
buộc giữa các khối và thành phần đó đã giúp việc sử dụng Sqlite đơn giản và dễ dàng
hơn.
Hình 6. Tập tin thư viện Sqlite trong công cụ lập trình Xcode
1.2.5
Tính linh hoạt
Sqlite là CSDL nhúng, nó cung cấp những điều kiện tốt nhất như sức mạnh và
tính linh hoạt của một CSDL có hệ thống font-end, và đơn giản, nhỏ gọn như hệ thống
back- end. Hệ thống font-end bao gồm trình biên dịch SQL bên trong hệ thống CSDL,
có nhiệm vụ thực thi và xử lý các câu lệnh truy vấn. Còn hệ thống back-end đảm nhiệm
chức năng lưu trữ dữ liệu cho Sqlite. Theo đó, không cần cấu hình máy chủ, không cần
kết nối mạng hoặc không phải lo lắng về việc kết nối CSDL, và không có giới hạn nền
tảng, không phải tìm hiểu kiến trúc API và miễn phí về bản quyền. Thay vào đó, nếu
bạn muốn sử dụng CSDL Sqlite, bạn chỉ cần đưa Sqlite vào ứng dụng.
Hình 7. Danh sách API của Sqlite
1.2.6
Cấp phép tự do
Tất cả mã nguồn của Sqlite được chia sẻ mà không cần giấy phép. Ai cũng có thể
sử dụng bất kỳ phần nào của Sqlite mà không phải bồi thường bản quyền tác giả. Sqlite
không giới hạn pháp lý về cách bạn có thể sử dụng mã nguồn dưới mọi hình thức như
chỉnh sửa, kết hợp, phân phối, bán và sử dụng cho bất kỳ mục đích thương mại mà
không có phí bản quyền hay bị hạn chế. Tóm lại Sqlite là hệ quản trị CSDL miễn phí.
Hình 8. Sqlite không yêu cầu bản quyền
1.2.7
Tính tin cậy
Mã nguồn của Sqlite không chỉ miễn phí mà Sqlite còn cho phép viết trong đó.
Mã nguồn của Sqlite bao gồm gần 70.000 dòng chuẩn được việc bằng ngôn ngữ C, mã
nguồn rõ ràng, được chú thích rất tốt. Mã nguồn còn được thiết kế giúp người sử dụng
tiếp cận, dễ dàng hiểu và dễ dàng chỉnh sửa và dễ dàng truy cập. Với lập trình viên thạo
ngôn ngữ C thì có thể theo dõi mọi phần của mã nguồn Sqlite hoặc với mã nguồn đó thì
họ có thể đủ thời gian để tìm hiểu.
Thêm nữa, mã nguồn của Sqlite cung cấp API đầy đủ tính năng đặc biệt cho
việc tuỳ chọn và mở rộng Sqlite thông qua việc bổ sung các hàm do người dùng định
nghĩa, tập hợp và đối chiếu tuần tự cùng với hỗ trợ cho các hoạt động bảo mật.
1.2.8 Tính tiện lợi
Hình 9. Một đoạn mã nguồn thƣ viện của Sqlite
Ngoài những tính năng giống như các hệ quản trị CSDL khác, thì Sqlite còn có
một số các chức năng duy nhất mà chỉ Sqlite mới có. Nó bao gồm các tính năng như:
gán kiểu động, giải quyết xung đột và khả năng đính kèm nhiều CSDL cho một phiên
làm việc đơn lẻ.
Tính năng gán kiểu động của Sqlite gần giống với ngôn ngữ kịch bản. Đặc biệt,
kiểu của biến được xác định bằng chính giá trị của nó, mà không phải cần định nghĩa
trước như các ngôn ngữ khác như C và Java. Hầu hết các hệ thống CSDL giới hạn giá
trị các trường khi định nghĩa một kiểu trong cột tương ứng. Nhưng trong Sqlite thì các
cột có thể có những kiểu được định nghĩa, và các trường không bị giới hạn giá trị, và
biến trong ngôn ngữ kịch bản có thể được gán giá trị với các kiểu khác nhau.
Thêm nữa, chức năng giải quyết xung đột trong Sqlite cũng là một tính năng
tiện lợi khác. Chẳng hạn khi thực thi câu lệnh UPDATE bạn có thể gặp lỗi xung đột
kiểu của biến. Sqlite có câu lệnh UPSET hoặc MERGE để giải quyết vấn đề xung đột
đó.
Cuối cùng là tính năng đính kèm tập tin CSDL bên ngoài vào phiên bản làm
việc hiện tại. Tính năng này được dùng khi bạn đang kết nối và làm việc với một
CSDL, bạn muốn làm việc với một CSDL khác cùng một thời điểm, bạn có thể dùng
câu lệnh ATTACH để thực hiện mục đích này.
Tóm lại, với việc cung cấp một số tính năng đặc biệt thì Sqlite giúp người dùng
sử dụng và thao tác với hệ quản trị Sqlite dễ dàng và tiện lợi hơn.
1.3
1.3.1
Hiệu suất hoạt động và hạn chế
Hiệu suất hoạt động
Sqlite là CSDL có tốc độ cao. Tuy nhiên, theo đánh giá chung thì có một số chức
năng Sqlite có thể làm nhanh hơn các hệ quản trị CSDL khác, và một số chức năng
khác thì không thể làm hoặc không thể làm tốt như CSDL khác. Sqlite sử dụng cấu trúc
cây-B dùng để đánh chỉ mục và cây-B, cây+B dùng trong bảng dữ liệu, đây cũng là
cách mà hầu hết các hệ thống CSDL khác đều dùng. Đối với các câu lệnh đơn giản như
SELECT, INSERT, UPDATE, so với các CSDL khác thì Sqlite thực hiện nhanh hơn.
Có 2 lý do chính, lý do thứ nhất là các câu lệnh đó thường được thực thi hiện trên bộ
nhớ RAM hoặc ổ đĩa. Lý do thứ hai là Sqlite tốn kém ít dung lượng cho việc bắt đầu
một giao dịch hoặc tạo ra một kế hoạch truy vấn và Sqlite không phải chịu chi phí để
thực hiện việc kết nối đến máy chủ hay không phải đàm phán xác thực các quyền. Do
đó, Sqlite thực hiện các truy vấn đơn giản nhanh hơn.
Thực hiện kiểm tra các câu lệnh INSERT, SELECT, UPDATE, DELETE,
DROP TABLE trên hệ quản trị CSDL Sqlite, MySql và PostgreSQL để đưa ra tốc độ
truy vấn của Sqlite so với 2 hệ quản trị còn lại. Với Sqlite, việc kiểm tra này sẽ được
thực hiện trên phiên bản SqliteManager 0.8.1 tích hợp CSDL Sqlite 3.8.3.1 . Với
PostgreSQL, việc kiểm tra được thực hiện trên phiên bản mới nhất là 9.3.4. Các phần
mềm này được cài đặt trên Window 8 64bit với cấu hình: CPU 2.5 GHz, 2.0 GB.
Kiểm tra 1: Thực thi 1000 câu lệnh INSERT
CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100));
insert into t1 VALUES(1,101, 'so 101');
insert into t1 VALUES(2,102, 'so 102');
…996 lệnh
insert into t1 VALUES(999,1999, 'so 999');
insert into t1 VALUES(1000,2000, 'so 1000');
Kiểm tra 2: Thực thi 1000 câu lệnh INSERT có INDEX
CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100));
CREATE INDEX i2 ON t2(c);
insert into t2 VALUES(1,301, 'so 301');
insert into t2 VALUES(2,302, 'so 302');
…996 lệnh
insert into t2 VALUES(99,399, 'so 399');
insert into t2 VALUES(1000,400, 'so 400');
Kiểm tra 3: Thực thi 1000 câu lệnh UPDATE không có INDEX
update t1
update t1
set
set
b = 1101
where
a = 1;
b = 1102
where
a = 2;
…996 lệnh
update t1
update t1
set b = 1199 where a = 999;
set b = 1200 where a = 1000;
Kiểm tra 4: Thực thi 1000 câu lệnh UPDATE có INDEX
update t2 set b = 2101 where a = 1;
update t2 set b = 2102 where a = 2;
…996 lệnh
update t2 set b = 2199 where a = 999;
update t2 set b = 2200 where a = 1000;
Kiểm tra 5: Thực thi câu lệnh INNER JOINT
SELECT t1.a from inner join t2 on t1.b = t2.b;
Kiểm tra 6: Thực thi câu lệnh SELECT không có INDEX
Select b from t1 where c like '%2%';
Kiểm tra 7: Thực thi câu lệnh SELECT có INDEX
Select b from t2 where c like '%2%';
Kiểm tra 8: Thực thi câu lệnh DELETE có INDEX
delete from t1 where c like '%2%';
Kiểm tra 9: Thực thi câu lệnh DELETE không có INDEX
delete from t2;
Kiểm tra 10: Thực thi 1000 câu lệnh INSERT
BEGIN;
CREATE TABLE t3(a INTEGER, b INTEGER, c VARCHAR(100));
insert into t3 VALUES(1,301, 'so 301');
insert into t3 VALUES(2,302, 'so 302');
…996 lệnh
insert into t3 VALUES(999,3999, 'so 3999'); COMMIT;
Sau khi thực hiện các kiểm tra, kết quả thởi gian thực thi trên từng hệ quản trị
CSDL được liệt kê theo bảng 2.1:
Hệ quản trị CSDL
PostgreSQL
Sqlite
PostgreSQL
Sqlite
PostgreSQL
Sqlite
Kiểm tra
1
2
3
Thời gian
(giây)
0.181
0.196
0.416
0.267
0.668
0.367
chạy
PostgreSQL
4
0.933
Sqlite
0.398
PostgreSQL
5
1.705
Sqlite
0.048
PostgreSQL
6
0.217
Sqlite
0.043
PostgreSQL
7
0.045
Sqlite
0.002
PostgreSQL
8
0.162
Sqlite
0.146
PostgreSQL
9
0.053
Sqlite
0.188
PostgreSQL
10
0.181
Sqlite
0.17
Bảng 2. Kết quả so sánh thời gian chạy của các hệ quản trị CSDL
Một loạt các kiểm tra trên đã được thực hiện để đo hiệu suất tương đối của
SqliteManager 0.8.1 tích hợp CSDL Sqlite 3.8.3.1, PostgreSQL 9.3.4. Một số kết luận
sau khi thực hiện kiểm tra:
-
Tốc độ thực thi chênh lệch nhau không lớn nhưng Sqlite 3.8.3.1 thường
chạy nhanh hơn PostgreSQL 9.3.4.
-
Sqlite hoạt động tốt nếu nhóm nhiều hoạt động trong một giao dịch
Đối với những truy vấn lớn và phức tạp hơn thì đỏi hỏi hệ quản trị phải cần thời
gian kết nối đến máy chủ hoặc cần các chi phí giao dịch và các chiến thuật để CSDL
hoạt động tối ưu. Trong trường hợp này, Sqlite chắc chắn có thể làm được các truy vấn
nhưng Sqlite không có khả năng làm các truy vấn đó tối ưu và tốc độ truy vấn sẽ không
nhanh. Vì vậy, nếu bạn đang chọn một hệ quản trị CSDL cho một hệ thống lớn và phức
tạp thì bạn nên chọn Oracle hoặc PostgreSQL hơn là chọn Sqlite. Sqlite chỉ phù hợp với
các ứng dụng vừa và nhỏ, do đó nó đặc biệt phù hợp với các ứng dụng chạy trên thiết bị
di động.
1.3.2 Hạn chế của Sqlite
Cũng giống như các hệ quản trị CSDL khác, Sqlite cũng có những ưu điểm và
nhược điểm. Tuy nhiên, với đặc điểm là Sqlite là một CSDL nhúng, được thiết kết cho
các ứng dụng vừa và nhỏ nên những hạn chế của Sqlite lại phù hợp với mục đích sử
dụng của nó. Nhìn chung, Sqlite có 2 hạn chế chính:
1.
Hỗ trợ ghi đồng thời: Tại cùng một thời điểm, Sqlite cho phép nhiều
người có thể đọc dữ liệu nhưng chỉ cho phép một người duy nhất có thể
ghi vào CSDL Sqlite. Khi có một người đang thực hiện ghi vào CSDL
Sqlite thì không ai có thể truy cập và CSDL trong thời điểm đó. Vì
Sqlite không có cơ chế để giảm thiểu khoảng thời gian hạn chế chiếm
dụng quyền truy cập
2.
Kết nối: Mặc dù CSDL Sqlite có thể được chia sẻ qua hệ thống tập tin
mạng, nhưng độ trễ liên quan đến các hệ thống tập tin có thể là nguyên
nhân dẫn đến hiệu suất bị ảnh hưởng. Tệ hơn nữa, việc xảy ra lỗi mạng
trong quá trình chia sẻ có thể làm các tập tin Sqlite bị chỉnh sửa và thay
đổi hoặc có thể bị lỗi. Sqlite đã có các phiên bản NFS để điều khiển việc
khoá tập tin – không cho phép chỉnh sửa tập tin trong quá trình chia sẻ
trên mạng. Tuy nhiên, các phiên bản NFS này đã hoạt động không hoàn
toàn tốt trong mọi trường hợp.
Hầu hết các hạn chế được nêu trên là “cố ý”, là kết quả của việc thiết kế Sqlite.
Ví dụ như hạn chế hỗ trợ ghi đồng thời, nếu Sqlite có khả năng ghi đồng thời thì làm
cho CSDL này trở nên phức tạp và điều này đi ngược với sự đơn giản trong thiết kế của
Sqlite. Tương tự, hạn chế không hỗ trợ kết nối mạng cũng là mục đích của các nhà phát
triển Sqlite. Sqlite là CSDL nhúng, không hỗ trợ kết nối mạng. Với mục đích ban đầu
Sqlite được thiết kế để hoạt động như một khối đơn giản, nhỏ gọn và dễ sử dụng, được
nhúng vào bên trong ứng dụng. Do đó, các hạn chế của Sqlite không cản trở nhiều trong
việc các mục đích sử dụng của nó.
Trong khi Sqlite làm khá tốt một số thực thi câu lệnh SQL thì có một số các
thực thi mà Sqlite không thể thực thi được.
1. Hỗ trợ hoàn tất Trigger: Sqlite hỗ trợ hầu hết các tính năng chuẩn cho
trigger. Tuy nhiên, đối với tất cả các kiểu trigger, thì Sqlite yêu cầu hành
vi cho mỗi dòng, còn đối với kiểu trigger cho tất cả các câu lệnh thì
Sqlite không hỗ trợ được.
2. Hỗ trợ hoàn tất câu lệnh ALTER TABLE: Sqlite chỉ hỗ trợ các câu lệnh
RENAME TABLE và ADD COLUMN là một dạng khác của câu lệnh
ALTER TABLE. Những dạng khác của câu lệnh ALTER TABLE
như
DROP COLUMN, ALTER COLUMN và ADD CONSTRAINT không
thực
thi được.
3.Câu lệnh RIGHT và FULL OUTER JOIN: Sqlite thực thi được câu lệnh
LEFT OUTER JOIN, nhưng không thể thực thi được câu lệnh RIGHT
OUTER JOIN hoặc FULL OUTER JOIN. Câu lệnh RIGHT OUTER
JOIN có thể thực hiện được nếu đảo ngược thứ tự của bảng và chỉnh sửa
các ràng buộc JOIN. Câu lệnh FULL OUTER JOIN có thể được thực
hiện nếu kết hợp 2 câu lệnh LEFT OUTER JOIN, UNION và lọc giá trị
NULL bằng mệnh đề WHERE.
4.Không thể cập nhật View: View trong Sqlite chỉ có thể đọc. Bạn không thể
thực thi câu lệnh DELETE, INSERT hay UPDATE trên View. Nhưng
Sqlite cho phép tạo một trigger để thực hiện DELETE, INSERT hay
UPDATE một View và làm những gì cần thiết trên thân hàm của trigger.
5. Cửa sổ hàm: Một chức năng mới được mô tả trong ANSI SQL 99 là cửa
sổ hàm. Nó cung cấp việc phân tích hàm để lấy kết quả, bảng xếp hạng,
tính trung bình, độ trễ và phép toán chính. Sqlite chỉ hỗ trợ trong ANSI
SQL 92, nên cửa sổ hàm không được hỗ trợ.
1.4
6. GRANT and REVOKE: Sqlite đọc và ghi trên tập tin đĩa thông thường,
quyền truy cập duy nhất có thể được áp dụng là truy cập tập tin thông
thường của hệ điều hành cấp dưới. Lệnh GRANT và REVOKE thường
được tìm thấy ở hệ quản trị CSDL quan hệ mô hình Client – Server, trong
khi Sqlite là CSDL nhúng nên nếu có thực thi lệnh GRANT và REVOKE
thì lệnh này không có ý nghĩa.
So sánh hệ quản trị SQLite với các hệ quản trị khác
So với các hệ quản trị CSDL lớn như MySql hay PosgreSql thì Sqlite có những
ưu và nhược điểm. Việc đưa ra một số đặc điểm như cài đặt, mô hình hệ thống sử dụng,
kiểu dữ liệu được hỗ trợ, cách sử dụng và ưu điểm, nhược điểm của ba hệ quản trị
CSDL Sqlite, MySQL, PostgreSQL để thấy được sự khác nhau giữa chúng.
1.4.1 Cài đặt
Hệ quản trị CSDL Sqlite là tập tin duy nhất. Sqlite không yêu cầu cấu hình nên
khi sử dụng chúng người sử dụng không cần cài đặt. Trong khi, để sử dụng hệ quản trị
CSDL MySQL và PostgreSQL thì cần cài đặt và cấu hình phức tạp. Hai hệ quản trị
CSDL này yêu cầu cấu hình, quản trị hệ thống. Đặc biệt, để sử dụng được những chức
năng phức tạp hơn hay những kiểu dữ liệu phức tạp hơn thì PostgreSQL còn yêu cầu cài
đặt thêm những phần mềm phụ trợ như PostGIS. Có thể nói, việc không cần cài đặt thì
Sqlite có thể dễ dàng sử dụng hơn so với hệ quản trị CSDL MySQL và PostgreSQL.
1.4.2
Kiểu dữ liệu
Hầu hết các CSDL như MySQL và PostgreSQL đề sử dụng kiểu dữ liệu tĩnh thì
Sqlite sử dụng kiểu dữ liệu động. Kiểu dữ liệu này được kết hợp với giá trị trong cột dữ
liệu. Một số kiểu dữ liệu tương tự sẽ được nhóm vào nhóm gọi là kiểu dữ liệu tương
tự.
Tên kiểu dữ liệu
Tên kiểu dữ liệu
tương tự
INT INTEGER
INTEGER
TINYINT
SMALLINT
MEDIUMINT
UNSIGNED BIG INT
INT2
INT8
CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOB
TEXT
BLOB
NONE
REAL
DOUBLE
DOUBLE PRECISION
FLOAT
REAL
NUMERIC
NUMERIC
DECIMAL(10,5)
BOOLEAN DATE
DATETIME
Bảng 3. Kiểu dữ liệu trong hệ quản trị CSDL Sqlite
Các kiểu dữ liệu trong Sqlite đều là nhưng kiểu dữ liệu trong hầu hết các CSDL.
Tuy nhiên, Sqlite không có những kiểu dữ liệu không gian như kiểu point, polygon,
path..như trong CSDL PostgreSQL. Đây cũng là điều hiển nhiên vì PostgreSQL là hệ
quản trị lớn, nó hỗ trợ nhiều kiểu dữ liệu để phù hợp với nhiều nhu cầu sử dụng khác
nhau.
1.4.3 Mô hình CSDL
Hệ quản trị CSDL Sqlite được sử dụng dưới dạng thư viện nhúng và không chạy
theo kiểu server độc lập. Trong khi hệ quản trị CSDL MySQL và PostgreSQL được sử
dụng chủ yếu trong các hệ thống sử dụng mô hình Client-Server.
1.4.4
Sử dụng
Nhờ những đặc trưng mà mỗi hệ quản trị CSDL được sử dụng trong một số hệ
thống và được khuyến cáo không nên dùng trong một số trường hợp khác.
Hệ quản trị CSDL Sqlite được khuyên dùng trong ứng dụng nhúng như ứng
dụng trên di động, trong trường hợp các ứng dụng đọc/ghi trực tiếp vào ổ đĩa, hay
những website có lưu lượng truy cập trung bình. Mặt khác, Sqlite không nên dùng
trong trường hợp ứng dụng hỗ trợ nhiều người dùng đồng thời do Sqlite không hỗ trợ
ghi đồng thời, hay các hệ thống sử dụng mô hình Client/Server hay hệ thống yêu cầu
tính đồng thời cao.
Với hệ quản trị MySQL, MySQL phù hợp hệ thống phân tán, hệ thống yêu cầu
tính bảo mật cao, website và ứng dụng web. MySQL không được khuyến khích dùng
trong trường hợp phải tuân thủ đầy đủ các tiêu chuẩn SQL, trong hệ thống đòi hỏi tính
đồng thời cao và hệ thống yêu cầu một số tính năng mà MySQL vẫn còn thiếu như tìm
kiếm full-text.
Có thể nói, hệ quản trị PostgreSQL tốt hơn cả so với hệ quản trị Sqlite và
MySQL. PostgreSQL được khuyên dùng trong nhiều trường hợp mà Sqlite và MySQL
khó làm được như hệ thống yêu cầu tính toàn vẹn dữ liệu, CSDL yêu cầu các thủ tục
tùy chỉnh, khả năng tích hợp CSDL vào hệ thống và những hệ thống có thiết kế phức
tạp. Nhưng cũng có một số trường hợp PostgreSQL không được khuyến khích dùng
như hệ thống yêu cầu tốc độ hoạt động nhanh, và trường hợp mong muốn cài đặt đơn
giản.
1.4.5
Ưu điểm và nhược điểm
Mỗi một hệ quản trị CSDL đều có những ưu và nhược điểm. Với Sqlite, Sqlite
có những ưu điểm như dung lượng thư viện nhỏ (khoảng 250Kb), mỗi CSDL được lưu
trữ trong một tập tin duy nhất, kích thước bản ghi trong CSDL có thể thay đổi và tốc độ
hoạt động của chúng nhanh. Bên cạnh những ưu điểm thì Sqlite còn tồn tại khá nhiều
nhược điểm như không hỗ trợ ghi đồng thời, không hỗ trợ một số chuẩn SQL và đặc
biệt là không hỗ trợ GRANT và REVOKE. Trong khi đó MySQL và PostgreSQL lại
làm rất tốt các nhược điểm của Sqlite. Ngoài ra, MySQL có một số ưu điểm nữa như
tính bảo mật, nhanh và có khả năng mở rộng. PostgreSQL thì có một số ưu điểm là mã
nguồn mở, khả năng mở rộng kiểu dữ liệu, mở rộng các hàm. PostgreSQL được biết
đến là một hệ quản trị CSDL mạnh, cấu hình phức tạp thì kéo theo đó là hiệu suất hoạt
động không cao.
Ngoài những khác biệt trên, so với hệ quản trị PostgreSQL thì Sqlite có những
khác biệt đáng kể. Những khác biệt này được liệt kê trong bảng 1.4
Sqlite
- Định dạng tập tin ứng dụng
PostgreSQL
CSDL doanh nghiệp
- Không có máy chủ
Client / Server
- Tập tin duy nhất trên ổ đĩa
Các tập tin ẩn
- Tương thích ngược giữa phiên bản
mới và phiên bản cũ
Dump và restore dữ liệu
Nhiều tập tin nhị phân
- Chỉ một tập tin ANSI-C
Bảng 4. Sự khác biệt giữa hệ quản trị Sqlite và PostgreSQL
Khi chọn lựa sử dụng một hệ quản trị CSDL, người dung cần quan tâm đến các
đặc điểm về kiến trúc, hệ điều hành hỗ trợ… bảng 1.4 đưa ra những thông tin của từng
hệ quản trị CSDL.
Đặc điểm
Sqlite
MySQL
PostgreSQL
Kiến trúc
Mô hình quan hệ
Mô hình quan hệ
Mô hình quan hệ đối tượng
Hệ điều hành
Window, Mac
OS X, Linux,
Unix, BSD,
Symbian,
AmigaOS
Kiểu Động
z/OS, Window,
Mac OS X, Linux,
Unix, BSD,
Symbian,
AmigaOS
Kiểu Tĩnh
Window, Mac OS X, Linux, BSD
Chỉ mục
Reverse, Fulltext, R-/R+ Tree
Hash, Full-text, R/R+ Tree
Bitmap, Expression, GIN, GiST,
Hash,
Partial, Full-text, R/R+ Tree, Reverse
Đối tượng khác
External Routine,
Trigger
Cursor, Function,
Procedure,
External Routine,
Trigger
Cursor, DataDomain, Function,
Procedure, External Routine,
Trigger
Chức năng
ACID, toàn
vẹn
tham
chiếu,
giao
dịch
và
Unicode
ACID,
toàn
vẹn
tham
chiếu,
giao
dịch
và
Unicode
Sao lưu, hàm tùy chọn, khả năng
mở rộng, hỗ trợ định dạng XML,
ACID, toàn vẹn tham chiếu, giao
dịch và Unicode
Khả năng của
CSDL
Except,
Intersect, Inner
Joins,
Inner
Selects, Union
Merge Joins, Outer Merge Joins, Outer Joins, truy vấn
Joins
song song, Except, Intersect, Inner
Joins, Inner Selects,Union
Kiểu hệ thống
Kiểu Tĩnh
Bảng 5. So sánh giữa hệ quản trị Sqlite,MySQL và PostgreSQL