Tải bản đầy đủ (.pdf) (63 trang)

Mở rộng truy vấn MySQL và ứng dụng chuyển đổi dữ liệu dạng bảng sang JSON

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.55 MB, 63 trang )



ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ



LÊ VĂN NAM




MỞ RỘNG TRUY VẤN MYSQL VÀ ỨNG DỤNG
CHUYỂN ĐỔI DỮ LIỆU DẠNG BẢNG SANG JSON





LUẬN VĂN THẠC SỸ












HÀ NỘI-2012






ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ



LÊ VĂN NAM



MỞ RỘNG TRUY VẤN MYSQL VÀ ỨNG DỤNG
CHUYỂN ĐỔI DỮ LIỆU DẠNG BẢNG SANG JSON


Ngành: Công Nghệ Thông Tin
Chuyên ngành: Hệ Thống Thông Tin
Mã số: 60 48 05


LUẬN VĂN THẠC SĨ
NGƯỜI HƯỚNG DẪN KHOA HỌC: TS NGUYỄN HẢI CHÂU








HÀ NỘI -2012

5





MỤC LỤC
LỜI NÓI ĐẦU 10
CHƢƠNG 1: TỔNG QUAN VỀ JSON VÀ ỨNG DỤNG 11
1.1 Khái niệm về JSON 11
1.2 Cấu trúc của Json 11
1.3 So sánh Json và XML 14
1.4 Phân tích JSON 15
1.5 Ứng dụng của JSON 19
CHƢƠNG 2: TỔNG QUAN KIẾN TRÚC HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
MYSQL 21
2.1 Lịch sử của hệ quản trị cơ sở dữ liệu MySQL 21
2.2 So sánh hệ quản trị CSDL MySQL và các hệ quản trị CSDL khác 22
2.3 Tổng quan kiến trúc MySQL 24
2.3.1 Giới thiệu 24
2.3.2 Quản lý kết nối và an ninh 25
2.3.3 Tối ưu hóa thực thi 25
2.3.4 Kiểm soát đồng thời 26
2.3.5 Kiểm soát giao dịch 29

2.4 Các Storage engine trong kiến trúc MySQL 34
2.4.1 Các Storage engine. 34
2.4.2 Các điểm ưu việt của Storage engine 35
CHƢƠNG 3: MỞ RỘNG TRUY VẤN CHUYỂN ĐỔI DỮ LIỆU SANG DẠNG
JSON 37
3.1 Hàm do người dùng định nghĩa (UDF) 37
3.1.1 Hàm UDF đơn giản 38
3.1.2 Hàm UDF tổng hợp 43
3.1.3 Xử lý tham số trong hàm UDF 48
3.1.4 Giá trị trả về của hàm UDF và kiểm soát lỗi trong hàm UDF. 51
3.1.5 Biên dịch và cài đặt hàm UDF 51
3.1.6 Phân quyền truy cập hàm UDF 54
6




3.2 Xây dựng hàm UDF chuyển đổi dữ liệu truy vấn sang dạng JSON 55
3.2.1.Hàm udf_json_to_array() 55
3.2.2 Hàm udf_json_to_member 56
3.2.3 Hàm udf_json_to_object 57
3.2.4 Hàm udf_json_to_value 58
KẾT LUẬN 64
TÀI LIỆU THAM KHẢO 65
7




DANH MỤC CÁC HÌNH

Hình 1.1 Cấu trúc của JSON 12
Hình 1.2 Kiếu dữ liệu mảng của JSON 12
Hình 1.3 Các kiểu dữ liệu của các phần tử trong mảng 13
Hình 1.4 Dữ liệu kiểu ký tự của JSON 13
Hình 1.5 Dữ liệu kiểu số của JSON 14
Hình 1.6 Quá trình xử lý truyền và nhận dữ liệu dạng JSON giữa máy chủ và máy khách
16
Hình 1.7 Quá trình truyền dữ liệu dạng JSON tại máy khách 16
Hình 1.8 Quá trình xử lý dữ liệu dạng JSON tại máy chủ 17
Hình 2.1 Kiến trúc tổng quan của hệ quản trị cơ sở dữ liệu MySQL 24
Hình 2.2 Kiến trúc MySQL với các kỹ thuật lưu trữ có thể gắn thêm 34



8




DANH MỤC CÁC BẢNG

Bảng 1.1 So sánh JSON và XML 16
Bảng 2.1 : So sánh về hệ điều hành hỗ trợ 22
Bảng 2.2 : So sánh về các tính năng cơ bản. 23
Bảng 2.3 : So sánh về sự hỗ trợ bảng tạm và khung nhìn 23
Bảng 2.4 : So sánh về chức năng chỉ mục 23
Bảng 2.5 : So sánh về các đối tượng khác 23
Bảng 2.6 Các mức cô lập ANSI SQL 37
Bảng 3.1 Kiểu dữ liệu của C, C++ tương ứng với kiểu dữ liệu trong MySQL 32
Bảng 3.2 Các biến thành viên của mảng attribute_lengths 50



9




DANH MỤC CÁC TỪ VIẾT TẮT

Viết tắt
Đầy đủ-mô tả
CSDL
Cơ sở dữ liệu
Server
Máy chủ
UDF
User-Defined Functions-Hàm do người dùng định nghĩa
JSON
JavaScript Object Notation-Một định dạng trao đổi dữ liệu
Mailbox
Hộp thư điện tử
Read/write
Đọc/ghi
SQL
Structured Query Language-Ngôn ngữ truy vấn dữ liệu
XML
eXtensible Markup Language-Ngôn ngữ đánh dấu dữ liệu
ISO
International Organization for Standardization –Tổ chức tiêu
chuẩn quốc tế

Cookie
Thông tin lưu trong máy tính để nhận biết người dùng ghé
thăm một trang web
W3C
World Wide Web Consortium-Là công ty lập ra các chuẩn cho
Internet nhất là Word Wide Web
HEX
Hệ đếm cơ số 16
Storage engine
Phương pháp lưu trữ dữ liệu trong hệ quản trị CSDL MySQL
10




LỜI NÓI ĐẦU
JSON (JavaScript Object Notation) là một định dạng trao đổi dữ liệu. Nó gần
giống như một tập hợp con của cú pháp JavaScript, mặc dù nó không phải là một tập
hợp con nghiêm ngặt. JSON rất hữu ích khi sử dụng làm định dạng trao đổi dữ liệu nó
được sử dụng trong hầu hết các ứng dụng web ajax như là một định dang trao đổi thay
cho XML. So với XML JSON có những ưu điểm sau:
 Không dài dòng, dữ liệu của nó nhỏ phù hợp trong việc trao đổi dữ liệu
 Trực tiếp giả mã tuần tự hóa (deserializable) thành cấu trúc các đối tượng bằng
cách sử dụng hàm sẵn có trong Javascript là eval().
Chính vì vậy hiện nay hầu hết các ngôn ngữ lập trình đều hỗ trợ các hàm để thực
hiện các thao tác đối với dữ liệu dạng JSON. Tuy nhiên khi sử dụng các hàm sẵn có
của các ngôn ngữ lập trình để thao tác với dữ liệu JSON có một nhược điểm là nó cần
phải lặp qua tập kết quả để có thể tạo ra định dạng JSON thỏa mãn điều kiện đối với
dữ liệu lớn việc này thường rất chậm nếu trong chính các hệ quản trị CSDL có hỗ trợ
các hàm chuyển đổi định dạng dữ liệu truy vấn sang dạng JSON thì tốc độ sẽ nhanh

hơn. MySQL là một hệ quản trị cơ sở dữ liệu mã nguồn mở được sử dụng phổ biến
hiện nay ngoài ưu điểm tốc độ nhanh, miễn phí MySQL còn hỗ trợ người sử dụng
thêm mới các hàm do người sử dụng tự viết để phù hợp với ứng dụng của mình. Chính
vì vậy tôi đã chọn đề tài “Mở rộng truy vấn MySQL và ứng dụng chuyển đổi dữ
liệu dạng bảng sang JSON”
Bố cục của luận văn được trình bày như sau:
Mở đầu
Đặt vấn đề về ý nghĩa, tính cấp thiết và tính thực thi của đề tài.
Chƣơng 1: Tổng quan về Json và ứng dụng
Trong chương này sẽ trình bày một cách khái quát về định dạng trao đổi dữ liệu
JSON như cấu trúc của dữ liệu dạng JSON, quá trình gửi và nhận dữ liệu dạng JSON
giữa máy chủ và máy khách và ứng dụng của JSON.
Chƣơng 2: Tổng quan kiến trúc hệ quản trị cơ sở dữ liệu MySQL
Trong chương này sẽ trình bày một cách khái quát và chi tiết nhất về lịch sử hình
thành và kiến trúc của hệ quản trị CSDL MySQL.
Chƣơng 3: Mở rộng truy vấn chuyển đổi dữ liệu sang dạng json.
Trong chương này sẽ trình bày các cách khác nhau để thêm mới một hàm vào
máy chủ MySQL. Tập trung tìm hiểu cách viết và thêm mới một hàm do người dùng
định nghĩa (UDF) vào MySQL từ đó ứng dụng vào xây dựng hàm UDF để chuyển đổi
dữ liệu truy vấn sang dạng JSON.
11




CHƢƠNG 1: TỔNG QUAN VỀ JSON VÀ ỨNG DỤNG
1.1 Khái niệm về JSON
JSON (JavaScript Object Notation) là một định dạng trao đổi dữ liệu. Nó gần
giống như một tập hợp con của cú pháp JavaScript, mặc dù nó không phải là một tập
hợp con nghiêm ngặt. Nó rất hữu ích khi viết bất kỳ loại ứng dụng dựa trên JavaScript,

bao gồm cả các trang web và phần mở rộng trình duyệt. Ví dụ chúng ta có thể lưu trữ
thông tin người dùng trong định dạng JSON trong một Cookie hoặc có thể lưu trữ các
phần mở rộng trong chuỗi giá trị JSON mà trình duyệt tham khảo tới.
JSON có khả năng biểu diễn cho dữ liệu số, các phép toán, chuỗi, giá trị null,
mảng và các đối tượng. Nó không biểu diễn cho dữ liệu phức tạp như hàm, biểu thức
thông thường, dữ liệu dạng ngày tháng. Như vậy các đối tượng ngày theo mặc định
được sắp xếp như là một chuỗi có chứa các ngày trong định dạng ISO.
Trong khi XML (được định nghĩa trong đặc tả kỹ thuật XML 1.0 tại W3C) là một
biểu diễn phổ biến để trao đổi thông điệp giữa máy chủ và máy khách. JSON cũng
được sử dụng với mục đích này và cho hiệu quả tượng tự như XML. Một trong những
lý do để chấp nhận JSON là ở chỗ các đối tượng JSON dễ dàng được thao tác hơn
bằng cách sử dụng các ngôn ngữ kịch bản như JavaScript, PHP, hoặc Ruby.
1.2 Cấu trúc của Json
JSON được xây dựng trên 2 cấu trúc phổ biến sau:
Cấu trúc 1:
Là tập hợp của các cặp tên và giá trị (name-value). Trong những ngôn ngữ khác
nhau đây thường là một đối tượng (object), bản ghi (record), cấu trúc (struct), từ
điển(dictionary), bảng băm (hash table), danh sách khoá (keyed list) hay mảng liên
hợp.
Ví dụ: “firstName” : “John”.
Cấu trúc 2:
Là một tập hợp các giá trị đã được sắp xếp. Trong hầu hết các ngôn ngữ nó có thể
là một mảng, véctơ, tập hợp.
Cấu trúc là tập hợp của các cặp tên và giá trị
Đây là một cấu trúc dữ liệu phổ dụng. Hầu như tất cả các ngôn ngữ lập trình hiện
đại đều hỗ trợ chúng trong một hình thức nào đó. Chúng tạo nên ý nghĩa của một định
dạng hoán vị dữ liệu với các ngôn ngữ lập trình cũng đã được cơ sở hoá trên cấu trúc
này.
12





Một đối tượng là một hỗn độn của các cặp tên và giá trị. Một đối tượng bắt đầu bởi
dấu ngoặc đơn trái { và kết thúc với dấu ngoặc đơn phải }. Từng tên được theo sau bởi
dấu hai chấm : và các cặp tên/giá trị được tách ra bởi dấu phẩy.

Hình 1.1: Cấu trúc của JSON
1
Ví dụ:
{ "firstName":"John" , "lastName":"Doe" }
Điều này tương đương với câu lệnh gán trong javascript như sau:
firstName = "John"
lastName = "Doe"
Một mảng là một tập hợp các giá trị đã được sắp xếp. Một mảng bắt đầu bởi dấu
mở ngoặc vuông [ và kết thúc với dấu ngoặc vuông phải ]. Các giá trị được cách nhau
bởi dấu phẩy.

Hình 1.2 Kiểu dữ liệu mảng của json
2
Giá trị có thể là một số, một chuỗi hay kiểu dữ liệu đúng sai, giá trị cũng có thể là một
mảng hay một đối tượng những cấu trúc này có thể lồng vào nhau.
Ví dụ :
{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}


1,2
Nguồn:

13






Hình 1.3 Các kiểu dữ liệu của các phần tử trong mảng
3
Một chuỗi(String) là một tập hợp của không hay nhiều ký tự Unicode, được đặt
trong dấu trích dẫn kép ("). Một chuỗi trong JSON rất giống như là chuỗi trong ngôn
ngữ lập trình C và Java.


Hình 1.4 Dữ liệu kiểu ký tự trong json
4
Kiểu số rất giống với kiểu số trong ngôn ngữ lập trình C và Java trừ định dạng bát
phân và hex là không thể dùng.
3,4,5
Nguồn:

14







Hình 1.5 Dữ liệu kiểu số trong Json
5
1.3 So sánh JSON và XML
Cả hai JSON và XML có thể được sử dụng để biểu diễn dữ liệu tự nhiên, các đối
tượng trong bộ nhớ, đoạn văn bản, định dạng trao đổi dữ liệu. Hơn nữa định dạng trao
đổi giữa liệu của JSON và XML là tương đương. Ví dụ khi gọi một dịch vụ web truy
cập công cộng của Yahoo chúng ta có thể xác định chuỗi tham số được biểu diễn bằng
XML hoặc JSON. Vì vậy khi quyết định theo một định dạng trao đổi dữ liệu nó không
phải là một vấn đề đơn giản tuy nhiên dựa vào những đặc trưng của ứng dụng cụ thể
mà đưa ra sự lựa chọn tốt nhất. JSON có kiểu dữ liệu giống như ngôn ngữ lập trình và
có cấu trúc do đó dễ dàng hơn trong việc ánh xạ với những dữ liệu trao đổi có cấu
trúc. Bảng 1.1 chỉ ra những điểm khác nhau giữa JSON và XML
Nội dung so sánh
XML
JSON
Kiểu dữ liệu (Data
type)
Không cung cấp kiểu dữ liệu người
ta phải dựa vào lược đồ XML để xác
định kiểu dữ liệu
Cung cấp các kiểu dữ
liệu đơn giản cũng như
kiểu dữ liệu có cấu
trúc.
Hỗ trợ mảng
Mảng được thể hiện qua các qui tắc
ví dụ sử dụng một phần tử bên ngoài
và nội dung của mảng là các phần tử

bên trong thông thường tên phần tử
bên ngoài sử dụng số nhiều của tên
các yếu tố bên trong
Hỗ trợ
Hỗ trợ kiểu đối tượng
Đối tượng được thể hiện thông qua
các qui ước, thường sử dụng thông
Hỗ trợ
15




qua thuộc tính của các phần tử
Hỗ trợ giá trị Null
Cần phải sử dụng xsi:nil trên phần tử
trong XML
Hỗ trợ
Chú thích
Hỗ trợ
Không hỗ trợ
Không gian tên
(Namespaces)
Hỗ trợ, loại bỏ nguy cơ xung đột khi
kết hợp các tài liệu lại với nhau.
Không gian tên cũng cho phép tài
liệu XML chuẩn có thể được mở
rộng một cách an toàn.
Không có khái niệm
Namespaces

Định dạng
Phức tạp. Cần phải có sự cố gắng lớn
để lập các tài liệu XML với các phần
tử và thuộc tính.
Đơn giản. Cung cấp
trực tiếp cách chuyển
đổi cho các ứng dụng
Kích cỡ
Tài liệu XML có xu hướng kéo dài
kích thước
Cú pháp ngắn gọn, các
trường định dạng được
hầu hết dữ liệu nó biểu
diễn
Phân tích cú pháp
trong Javascript
Cần sử dụng XML Dom và các ứng
dụng khác để chuyển đổi sang
Javascript
Không cần ứng dụng
khác để chuyển đổi
sang javascript chỉ cần
sử dụng hàm eval
trong Javascript

Bảng 1.1 So sánh JSON và XML
1.4 Phân tích JSON
JSON chỉ là một chuỗi văn bản và không phải là một đối tượng nó cần được
chuyển đổi sang một đối tượng trước khi làm cho nó trở lên hữu ích. Việc phân tích cú
pháp có thể được thực hiện với hàm Eval() trong javascript và nó an toàn hơn khi sử

dụng một chương trình phân tích cú pháp khác. Chúng ta có thể tải về các phân tích cú
pháp JSON bằng JavaScript tại địa chỉ Tệp tin này bao
gồm các hàm cho phép chúng ta tận dụng lợi thế của các đối tượng JSON trong đó có
2 phương thức sau rất hữu ích trong việc phân tích cú pháp của JSON
 JSON.parse(strJSON) - Chuyển một chuỗi JSON thành đối tượng của
Javascript.
 JSON.stringify(objJSON) - Chuyển đối tượng của Javascript thành chuỗi
JSON.
16




Quá trình xử lý việc truyền dữ liệu JSON giữa máy khách và máy chủ được mô tả
theo hình 1.6 như sau:

Về phía máy khách:

1. Tạo ra một đối tượng Javascript .
2. Sử dụng phương thức stringify để chuyển đối tượng thành một chuỗi JSON.
3. Gửi chuỗi địa chỉ URL đã mã hóa(URL-encode) bao gồm chuỗi JSON như một
phần của http request đến máy chủ nó có thể sử dụng phương pháp GET, POST để gửi
dữ liệu.



Máy khách
Máy chủ
Máy khách
Hình 1.6 Quá trình truyền và nhận dữ liệu JSON giữa máy chủ và máy khách

Hình 1.7 Quá trình xử lý dữ liệu JSON tại máy chủ
17




Về phía máy chủ :
1. Giải mã chuỗi JSON sau đó chuyển chuỗi JSON thành các đối tượng của
ngôn ngữ chúng ta chọn.
2. Thực hiện xử lý đối tượng theo yêu cầu của bài toán.

Nếu muốn gửi lại chuỗi JSON trả về phía máy khách
 Tạo một đối tượng mới để biểu diễn dữ liệu trả về.
 Chuyển đối tượng thành chuỗi JSON.
 Chuyển chuỗi JSON lại phía máy khách.
Về phía máy khách : Sau khi nhận được chuỗi JSON sẽ chuyển chuỗi thành các
đối tượng của Javascript và xử lý các đối tượng theo yêu cầu.
Ví dụ đoạn mã dưới đây chỉ ra làm thế nào để gửi dữ liệu JSON đến máy chủ
Về phía máy khách:
<html>
<head>
<script type="text/javascript"
src=" / /prototype.js"></script>
<script type="text/javascript"
src=" / /json.js"></script>
<script type="text/javascript">
function SendRequest(MSG)
{
document.getElementById("ResponseDiv").innerHTML="";
var objJSON = {

"msg" : MSG
Hình 1.8 Quá trình xử lý dữ liệu JSON trên máy chủ
18




};
var strJSON =
encodeURIComponent(JSON.stringify(objJSON));
new Ajax.Request("ReceiveJSON.jsp",
{
method: "post",
parameters: "strJSON=" + strJSON,
onComplete: Respond
});
}

function Respond(REQ)
{

document.getElementById("ResponseDiv").innerHTML=REQ.respo
nseText;
}
</script>
<title>Using JSON</title>
</head>

<body>
<h1>Request</h1>

<form>
<input type="button" value="Hi There!"
onClick="SendRequest(this.value)"/>
<input type="button" value="Good bye!"
onClick="SendRequest(this.value)" />
</form>
<h1>Response</h1>
<div id="ResponseDiv">Waiting </div>
</body>
</html>


19




Về phía máy chủ:
<%@ page language="java" contentType="text/html;
charset=ISO-8859-1" pageEncoding="ISO-8859-1"
import="java.net.*,org.json.simple.*"%>
<%
try
{
URLDecoder decoder = new URLDecoder();
String strJSON =
decoder.decode(request.getParameter("strJSON"));
JSONObject objJSON = (JSONObject)
JSONValue.parse(strJSON);


String Message = objJSON.get("msg").toString();
if (Message.equals("Hi There!"))
{
out.write("And hi there to you!");
}
else
{
out.write("Later Gator!");
}
}
catch (Exception e)
{
out.write(e.toString());
}
%>

1.5 Ứng dụng của JSON
JSON được ứng dụng trong một số trường hợp sau đây:
 Lưu trữ dữ liệu đơn thuần. Đôi khi chúng ta muốn lưu trữ dữ liệu dưới dạng
metadata ở phía máy chủ chuỗi JSON sẽ được lưu vào cơ sở dữ liệu và sau đó khi cần
dữ liệu thì sẽ được giải mã. Phương pháp lưu trữ dữ liệu này cũng tương tự như sử
dụng tính năng serialize và unserialize của các ngôn ngữ lập trình. Nhưng trong khi
20




serialize và unserialize sử dụng với cả dữ liệu và biểu thức và phụ thuộc vào ngôn ngữ
lập trình. Vì vậy nếu dữ liệu của chúng ta chỉ đơn thuần là dữ liệu cơ bản (chuỗi kí tự,
số…) thì hoàn toàn không nên sử dụng serialize mà nên sử dụng JSON.

 Sử dụng trong ngôn ngữ JavaScript và ActionScript để xử lý thông tin trả về từ
phía máy chủ rất nhanh về dễ dàng.
21




CHƢƠNG 2: TỔNG QUAN KIẾN TRÚC HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
MYSQL
2.1 Lịch sử của hệ quản trị cơ sở dữ liệu MySQL
MySQL là hệ quản trị cơ sở dữ liệu mã nguồn mở phổ biến nhất thế giới và được
các nhà phát triển rất ưa chuộng trong quá trình phát triển ứng dụng. MySQL là hệ
quản trị cơ sở dữ liệu tốc độ cao, ổn định và dễ sử dụng, có tính linh hoạt, hoạt động
trên nhiều hệ điều hành cung cấp một hệ thống lớn các hàm tiện ích rất mạnh. Với tốc
độ và tính bảo mật cao nên MySQL rất thích hợp cho các ứng dụng có truy cập CSDL
trên Internet. Hệ quản trị MySQL miễn phí hoàn. Hiện nay MySQL có rất nhiều phiên
bản cho các hệ điều hành khác nhau như : phiên bản Win32 cho các hệ điều hành dòng
Windows hay các phiên bản khác dành cho các hệ điều hành khác như Linux, Mac
OSX, Unix, FreeBSD, NetBSD, Novell Novell NetWare, SGI, Irix, Solaris, SunOS,…
Hệ quản trị CSDL MySQL là hệ quản trị cơ sở dữ liệu quan hệ sử dụng ngôn
ngữ truy vấn có cấu trúc (SQL). MySQL thường được sử dụng với các ngôn ngữ lập
trình PHP, Perl, và nhiều ngôn ngữ khác. Nó làm nơi lưu trữ những thông tin trên các
trang web viết bằng PHP hay Perl,
Lịch sử phát triển của MySQL: MySQL khởi đầu với cái tên MySQL AB và
được sáng lập từ ba chàng trai Michael Widenius, David Axmark, và Allan Larsson.
Công ty này sau đó được Sun Microsystems mua lại với giá 1000$.
Trong suốt quá trình lịch sử của MySQL đã có nhiều những mốc quan trọng mà
MySQL đồng hành cùng với nền công nghiệp máy tính. Trong đó có những mốc nổi
bật như sau:
- 2001: MySQL phát hành phiên bản 3.23.

- 2003: MySQL phát hành phiên bản 4.0. Phiên bản 4.0 có tính năng kết hợp
mệnh đề. Tính năng này cho phép hai nhóm dữ liệu có thể hòa trộn thành một nhóm
dữ liệu.
- 2004: MySQL phát hành phiên bản 4.1. Phiên bản 4.1 có tính năng mới như hỗ
trợ truy vấn con, lưu trữ trên các cấu trúc R-trees và B-trees.
- 2005: MySQL phát hành phiên bản 5.0. Phiên bản có các tính năng như con
trỏ(cursors), sự kiện(triggers), Khung nhìn (Views), Thủ tục(stored procedures) và
giao dịch(transactions). Tính năng con trỏ rất quan trọng bởi vì chúng giúp cho quá
trình truy nhập vào dòng trong câu truy vấn dễ dàng hơn. Trigger có hai phiên bản
khác nhau đó là dòng và câu lệnh. Về cơ bản thì triggers là những dòng lệnh dùng để
thực hiện một hành động do người lập trình chỉ ra, nó được thực hiện khi kết thúc một
hành động trong cơ sở dữ liệu.
22




- 2008: MySQL phát hành phiên bản 5.1. Phiên bản này có tính năng phân vùng,
lập lịch các sự kiện, sửa lỗi, máy chủ ghi nhật ký các bảng và plugin API.
MySQL không dừng lại ở phiên bản 5.1. MySQL 6.0 đã có các công trình thực
hiện và sẽ hứa hẹn sẽ có nhiều tính năng mới như toàn vẹn tham chiếu, hỗ trợ unicode
và một số kỹ thuật lưu trữ mới đáp ứng được nhu cầu lưu trữ dữ liệu ngày nay.
2.2 So sánh hệ quản trị CSDL MySQL và các hệ quản trị CSDL khác
Điểm khác nhau lớn nhất của MySQL so với các hệ quản trị CSDL khác là
MySQL hỗ trợ rất nhiều các kỹ thuật lưu trữ khác nhau. Ở phiên bản 5.6 thì MySQL
đang hỗ trợ hơn mười kỹ thuật lưu trữ khác nhau như MyISAM, InnoDB, Memory,
Merge, CSV, InfoBright…. Vì MySQL là mã nguồn mở, tính linh hoạt cao, uyển
chuyển nên chúng ta có thể tùy biến để thêm hoặc thay đổi các kỹ thuật để cho có thể
phù hợp với từng dạng ứng dụng.
Các chức năng khác của MySQL so với các hệ quản trị khác là như nhau như

View, StoreProcedure, Trigger, khả năng phục hồi và bảo mật.
Một trong các kỹ thuật lưu trữ mới nhất là InfoBright mà cộng đồng mã nguồn
mở xây dựng, đây là một kỹ thuật được dùng nhiều trong miền ứng dụng là các kho dữ
liệu. Với không gian lưu trữ là rất ít, tối đa có thể đạt 40/1 từ dữ liệu thô đưa vào trong
MySQL, tốc độ truy xuất rất nhanh vì kỹ thuật này dùng các thuật toán và phương
pháp lưu trữ mới. Kết hợp kỹ thuật InfoBright với các kho dữ liệu như Pentaho hay
Talend sẽ mang lại những thử nghiệm mới cho các doanh nghiệp xây dựng các ứng
dụng kho dữ liệu.
Việc so sánh hệ quản trị MySQL với một số hệ quản trị cơ sở dữ liệu khác giúp
chúng ta có cái nhìn tổng quan về ưu, nhược điểm của hệ quản trị MySQL. Thông tin
được đưa ra so sánh như : hệ điều hành hỗ trợ, các tính năng cơ bản, hỗ trợ bảng và
khung nhìn, chức năng đính chỉ mục và các đối tượng khác. Các bảng từ 2.1 đến 2.5 so
sánh các chức năng của hệ quản trị CSDL MySQL với các hệ quản trị CSDL khác.
Hệ điều hành hỗ trợ

Windows
Mac OS
X
Linux
BSD
UNIX
z/OS
MySQL





Có thể
Oracle




Không


PostgreSQL





Có thể

Bảng 2.1 : So sánh về hệ điều hành hỗ trợ
6

23




Các tính năng cơ bản

ACID
Referential
integrity
Transactions
Unicode
MySQL

Phụ thuộc
Phụ thuộc
Phụ thuộc
Có/UTF-8(3 byte) & UCS - 2
Oracle




PostgreSQL



Có/UTF-8(4-byte)
Bảng 2.2 : So sánh về các tính năng cơ bản
7
.
Hỗ trợ bảng và khung nhìn

Bảng tạm
Khung nhìn cụ thể
MySQL

Tương tự
Oracle


PostgreSQL

Tương tự

Bảng 2.3 : So sánh về sự hỗ trợ bảng tạm và khung nhìn
8
Chỉ mục

Cây R-/Cây
R+
Hàm
băm
Biểu
thức
(lập
trình)
Chỉ mục
từng
phần
Chỉ mục
đảo
Bitmap
GiST
MySQL
Trong SQL
5.0
MyISAM,
BDB, hoặc
bảng InnoBD
Chỉ có
bảng
HEAP
Không
Không

Không
Không
Không
Oracle
Chỉ có ở
phiên bản EE
Bảng
gộp

Không


Không
PostgreSQL







Bảng 2.4 : So sánh về chức năng chỉ mục
9
Các đối tƣợng khác

Domain
Cursor
Trigger
Hàm
Thủ tục

External
routine
MySQL
Không





Oracle






PostgreSQL







Bảng 2.5 : So sánh về các đối tƣợng khác
10
6,7,8,9,10
Nguồn

Korry Dougla and Susan Douglas, The comprehensive guide to building

programming and administering MySQL database pp.56
24




Nếu theo dõi các bảng từ 2.1 đến 2.5 so sánh giữa ba hệ quản trị cơ sở dữ liệu
MySQL, Oracle và PostgreSQL thì thấy rằng hệ quản trị cơ sở dữ liệu MySQL rất
mạnh, nó hoạt động được trên hầu hết các hệ điều hành, hỗ trợ rất nhiều tính năng cơ
bản, và hỗ trợ rất nhiều kiểu đánh chỉ mục.
Khả năng mở rộng là một trong những tính năng của MySQL đó là nó có thể
được mở rộng. Nếu với những gì mà MySQL cung cấp mà chúng ta vẫn chưa hài lòng,
chúng ta có thể thêm vào MySQL những gì phù hợp với ứng dụng của chúng ta. Ví dụ
chúng ta có thể thêm vào kiểu dữ liệu mới, hàm và toán tử mới và các thủ tục mới.
2.3 Tổng quan kiến trúc MySQL
2.3.1 Giới thiệu
Phần này cung cấp một cái nhìn tổng quan kiến trúc máy chủ cài hệ quản trị cơ
sở dữ liệu MySQL. Một bức tranh dễ hiểu mô hình các thành phần của MySQL làm
việc với nhau như thế nào sẽ giúp chúng ta hiểu về Server này. Hình 2.1 chỉ ra cấu trúc
logic của kiến trúc MySQL. Tầng cao nhất của kiến trúc bao gồm các dịch vụ không
phải là duy nhất đối với MySQL. Chúng là các dịch vụ mà hầu hết các công cụ dựa
trên mạng Client/Server hoặc các máy chủ cần như: điều khiển kết nối, xác thực, an
ninh và vv.
Tầng thứ hai là nơi mà mọi thứ trở nên đáng quan tâm. Phần lớn bộ não của
MySQL tập trung ở đây, bao gồm cả mã cho phân tích cú pháp truy vấn, phân tích, tối
ưu hóa, bộ nhớ đệm, và tất cả các chức năng built-in (ví dụ như ngày tháng, thời gian,
toán học, và mã hóa). Bất kỳ chức năng được cung cấp cùng với kỹ thuật lưu trữ sẽ
tồn tại ở cấp độ này, ví dụ như các thủ tục lưu trữ, triggers, và views.



Hình 2.1 Kiến trúc tổng quan của hệ quản trị cơ sở dữ liệu MySQL
11
25




Lớp thứ ba có chứa các kỹ thuật lưu trữ. Chúng có nhiệm vụ lưu trữ và thu hồi tất
cả các dữ liệu được lưu trữ trong MySQL.

Cũng giống như các hệ thống tập tin khác nhau cho GNU/Linux, mỗi kỹ thuật
lưu trữ có những ưu điểm và nhược điểm của nó. Các máy chủ giao tiếp với chúng
thông qua các API của kỹ thuật lưu trữ. Giao diện này làm ẩn đi sự khác biệt giữa các
kỹ thuật lưu trữ và làm cho chúng phần lớn là minh bạch ở lớp truy vấn. API chứa
một vài chục chức năng ở mức độ thấp, thực hiện các hoạt động như "bắt đầu một giao
dịch" hoặc "nhận hàng dữ liệu có khóa chính này". Các kỹ thuật lưu trữ không phân
tích cú pháp SQL hoặc giao tiếp với nhau chúng chỉ đơn giản đáp ứng các yêu cầu từ
máy chủ.
2.3.2 Quản lý kết nối và an ninh
Khi các máy khách kết nối với máy chủ MySQL, máy chủ cần xác thực chúng.
Xác thực dựa trên tên đăng nhập, máy chủ nguồn và mật khẩu. Xác nhận X.509 cũng
có thể được sử dụng trên một kết nối Secure Sockets Layer (SSL). Khi một máy
khách(Client) đã kết nối, máy chủ kiểm tra xem máy khách này có đặc quyền cho mỗi
truy vấn mà nó đưa ra hay không (Ví dụ có hay không máy khách được phép phát đi
một câu lệnh SELECT để truy cập bảng Country trong cơ sở dữ liệu).
2.3.3 Tối ƣu hóa thực thi
MySQL phân tích các truy vấn để tạo ra một cấu trúc bên trong (cây phân tích cú
pháp) và sau đó áp dụng một loạt các tối ưu hóa. Việc tối ưu hóa này có thể bao gồm
việc viết lại các truy vấn, xác định thứ tự mà nó sẽ đọc các bảng, lựa chọn các chỉ số
nào để sử dụng, vv…. Chúng ta có thể chuyển các gợi ý tới bộ tối ưu hóa thông qua

các từ khóa đặc biệt trong truy vấn, ảnh hưởng đến tiến trình ra quyết định của mình.
Chúng ta cũng có thể yêu cầu máy chủ để giải thích các khía cạnh khác nhau của việc
tối ưu hóa. Điều này cho phép chúng ta biết các quyết định của máy chủ đang thực
hiện và cung cấp cho chúng ta một điểm tham chiếu cho các truy vấn thực hiện lại,
lược đồ, và các thiết lập để làm cho mọi thứ chạy càng hiệu quả càng tốt.
Tối ưu hóa không thực sự quan tâm một bảng cụ thể sử dụng kỹ thuật lưu trữ nào
nhưng các kỹ thuật lưu trữ ảnh hưởng đến cách mà máy chủ tối ưu hóa truy vấn. Bộ tối
ưu hóa yêu cầu kỹ thuật lưu trữ về một số khả năng của mình và phí tổn của một số
hoạt động, và số liệu thống kê trên bảng dữ liệu.


11
Nguồn:
26




Ví dụ, một số kỹ thuật lưu trữ hỗ trợ các loại chỉ số có thể hữu ích cho các truy
vấn nhất định.
Trước khi phân tích truy vấn mặc dù máy chủ tham khảo bộ nhớ cache truy vấn
mà có thể lưu trữ các câu lệnh SELECT, cùng với các bộ kết quả của chúng. Nếu bất
cứ ai đưa ra một truy vấn giống hệt với một truy vấn đã có trong bộ nhớ cache, máy
chủ không cần phải phân tích, tối ưu hóa, hoặc thực hiện truy vấn gì mà chỉ đơn giản
là chuyển trở lại tập hợp kết quả được lưu trữ.
2.3.4 Kiểm soát đồng thời
Bất cứ khi nào nếu nhiều hơn một truy vấn để thay đổi dữ liệu đồng thời, lúc này
sẽ phát sinh vấn đề kiểm soát đồng thời. Mục đích của chúng tôi trong chương này sẽ
tìm hiểu về MySQL đã làm điều này ở hai cấp độ: cấp độ máy chủ và cấp độ kỹ thuật
lưu trữ. Kiểm soát đồng thời là một chủ đề lớn mà phần lớn nội dung lý thuyết của các

tài liệu viết về nó, nhưng luận văn này không mang tính lý thuyết hoặc thậm chí không
nói về nội tại MySQL. Vì vậy, chúng tôi sẽ chỉ cung cấp một cái nhìn tổng quan đã
được đơn giản hóa về cách mà MySQL đề cập của chương này.
Chúng tôi sẽ sử dụng một hộp thư điện tử trên một hệ thống Unix là một ví dụ.
Định dạng của tập tin cổ điển Mbox là rất đơn giản. Tất cả các thông điệp trong hộp
thư mailbox được nối với nhau theo trật tự cái này sau cái kia. Điều này làm cho nó rất
dễ dàng để đọc và phân tích các thông điệp thư. Nó cũng làm cho chuyển phát thư dễ
dàng: chỉ cần nối thêm một tin nhắn mới ở phần cuối của tập tin.
Nhưng những gì sẽ xảy ra khi có hai tiến trình cố gắng để chuyển các thông điệp
cùng một lúc tới cùng một hộp thư. Rõ ràng rằng điều này có thể làm lỗi hộp thư để lại
hai tin nhắn xen kẽ vào cuối của tập tin mailbox. Các hệ thống phân phối mail sử dụng
phương thức khóa để ngăn chặn việc lỗi file này. Nếu một khách hàng cố gắng chuyển
nhận thư lần thứ hai trong khi hộp thư bị khóa, nó phải chờ đợi để có được khóa riêng
của mình trước khi chuyển nhận thông điệp của mình.
Phương thức này hoạt động khá tốt trong thực tế nhưng nó lại mang đến sự
không hỗ trợ tính đồng thời. Bởi vì chỉ có một quá trình duy nhất có thể thay đổi hộp
thư tại bất kỳ thời điểm nhất định, phương pháp này sẽ trở thành vấn đề với một hộp
thư có dung lượng lớn.
2.3.4.1 Khóa Read/Write
Việc đọc từ hộp thư(mail box) không khó. Không ổn khi có nhiều khách hàng
cùng đọc đồng thời một thư. Bởi vì chúng không gây ra sự thay đổi, không có gì bị lỗi.
Nhưng chuyện gì xảy ra nếu một người nào đó cố để xóa số 25 trong khi các chương
27




trình khác đang đọc hộp thư đó. Vậy để cho an toàn việc đọc hộp thư yêu cầu phải
thận trọng.
Nếu chúng ta nghĩ rằng một hộp thư như là một bảng trong cơ sở dữ liệu và mỗi

thư như là một hàng thì ta dễ dàng nhận thấy vấn đề ở cùng nội dung. Với nhiều cách
hộp thư thực sự chỉ là một bảng cơ sở dữ liệu đơn giản. Việc sửa đổi các hàng trong
một bảng cơ sở dữ liệu tương tự như việc xóa hoặc thay đổi nội dung của các thông
điệp trong một file hộp thư.
Các giải pháp cho vấn đề kinh điển này của việc kiểm soát đồng thời là khá đơn
giản. Các hệ thống phải đối phó với việc truy cập read/write đồng thời thực hiện một
hệ thống khóa bao gồm hai loại khóa. Các khóa này thường được biết đến như việc
chia sẻ khóa: khóa riêng biệt hoặc các khóa read/write.
Nếu không có đáng lo ngại về ứng dụng khóa thực tế đang sử dụng chúng ta có
thể mô tả khái niệm theo các cách sau. Việc đọc khóa trên một tài nguyên nào đó phải
được chia sẻ, hoặc không khóa lẫn nhau, nhiều client có thể đọc một tài nguyên cùng
một thời điểm và không can thiệp với nhau. Mặt khác các khóa write là riêng biệt,
chúng chặn cả hai khóa write/read bởi vì chỉ các chính sách an toàn rành cho duy nhất
khách hàng đang ghi vào tài nguyên ở một thời điểm nhất định và ngăn ngừa tất cả
việc đọc khi một khách đang ghi.
Trong thế giới cơ sở dữ liệu, việc thực hiện khóa xảy ra tất cả các thời gian:
MySQL phải ngăn chặn một khách hàng đọc một phần dữ liệu trong khi người khác
đang thay đổi. Nó thực hiện quản lý khóa này trong nội bộ theo cách minh bạch trong
nhiều thời gian.
2.3.4.2 Điều khiển truy cập đồng thời
Khóa phân mảnh là một cách để cải thiện việc đồng thời chia sẻ nguồn tài
nguyên chia sẻ và trở nên có chọn lọc hơn về những gì chúng ta khóa. Thay vì khóa
toàn bộ tài nguyên, ta chỉ cần khóa một phần có chứa các dữ liệu chúng ta cần phải
thay đổi. Tốt hơn, việc khóa chỉ nên thực hiện chính xác với phần dữ liệu chúng ta có
kế hoạch thay đổi. Việc giảm thiểu số lượng dữ liệu mà chúng ta muốn khóa tại một
thời điểm, cho phép các thay đổi một nguồn tài nguyên nhất định nào đó xảy ra đồng
thời miễn là chúng không xung đột với nhau.
Vấn đề là khóa có tiêu thụ hết các tài nguyên. Hoạt động khóa tài nguyên bao
gồm nhận một khóa, kiểm tra để xem liệu khóa có rỗi hay không, giải phóng một khóa,
vv…. Nếu hệ thống dành quá nhiều thời gian cho việc quản lý khóa thay vì lưu trữ và

lấy dữ liệu thì hiệu suất có thể bị ảnh hưởng. Một hoạch định khóa là một sự thỏa hiệp
giữa khóa ở trên và an toàn dữ liệu và việc thỏa hiệp này sẽ ảnh hưởng đến hiệu năng.

×