2. Nội dung
1. Cơ bản về SQL & Tối ưu kiểu
2. Tối ưu sử dụng index
3. Tối ưu câu lệnh query
4. Tối ưu thiết kế bảng
5. Các kỹ thuật mới nâng cao hiệu năng
2
5. Normalization
Chuẩn 1
• Không có bản ghi trùng lặp
Chuẩn 2
• Là Chuẩn 1
• Các cột phụ thuộc hoàn toàn vào khóa chính
Chuẩn 3
• Là Chuẩn 2
• Các côt phụ thuộc trực tiếp vào khóa chính
5
10. Ưu điểm
Normalization Denormalization
• Tìm kiếm, sắp sếp và tạo index nhanh
• Mỗi bẳng có 1 hoặc ít các index
• Linh hoạt trong nhiều truy vấn
• Giảm giá trị null, bớt dư thừa dữ liệu
• Trigger và funciont sẽ thực hiện nhanh
hơn
• Dẽ bảo trì
• Giảm số lần thực hiện join
• Giảm số lượng khóa ngoài
• Giảm số lượng index
• Giảm số lượng bảng
10
11. Điều kiện áp dụng
• Với 1 DB chuẩn chưa chắc đã tốt
• Denormalization có thể cải thiện về tốc độ
những cần lắm rõ và bàn bạc kỹ
11
Normalization Denormalization
• Cần có kiến thức về chuẩn hóa
• Khi bắt đầu dự án
• Cần có kiến thức sau về chuẩn hóa
• Cần xem sét các cách giải quyết tăng
tốc độ khác
• Cần xem những cột và bẳng liên quan
đang được sử dụng ở đâu
• ORDER BY có được thực hiện hay
không
18. Denormalization
• Trường hợp đặc biệt
– Đếm số lần truy cập trang
– Cần đếm số tin nhắn trong 1 giờ
• Trường hợp nào chuẩn, trường hợp nào
không chuẩn?
18
20. Trigger
• Để tách bảng
20
<?php
function new_post(Request $request) {
// Get request's body
$body = json_decode($request->getContent(), true);
// Insert new post into articles table & retrieve its id
$id = DB::table('articles')->insertGetId($body);
// Insert new post's id into articles_preview table
DB::table('articles_preview')->insert([
'article_id' => $id
]);
}
22. Trigger
• SHOW TRIGGERS;
• SHOW TRIGGERS FROM database_name;
• SHOW TRIGGERS FROM classicmodels
WHERE `table` = 'employees';
• DROP TRIGGER table_name.trigger_name;
22
25. Partition
• Query hiệu quả hơn
– Select trong một parttion sẽ nhanh hơn
– Xóa tất cả dữ liệu trong 1 partition nhanh hơn
• Sử phần cứng hiệu quả hơn
• Tránh dead lock
=> Chia để trị
25
27. Partition
• RANGE
27
CREATE TABLE userslogs (
username VARCHAR(20) NOT NULL,
logdata BLOB NOT NULL,
created DATETIME NOT NULL,
PRIMARY KEY(username, created)
)
PARTITION BY RANGE( YEAR(created) )(
PARTITION from_2013_or_less VALUES LESS THAN (2014),
PARTITION from_2014 VALUES LESS THAN (2015),
PARTITION from_2015 VALUES LESS THAN (2016),
PARTITION from_2016_and_up VALUES LESS THAN MAXVALUE
28. Partition
• LIST
28
CREATE TABLE serverlogs (
serverid INT NOT NULL,
logdata BLOB NOT NULL,
created DATETIME NOT NULL
)
PARTITION BY LIST (serverid)(
PARTITION server_east VALUES IN(1,43,65,12,56,73),
PARTITION server_west VALUES IN(534,6422,196,956,22)
);
29. Partition
• HASH
29
CREATE TABLE serverlogs2 (
serverid INT NOT NULL,
logdata BLOB NOT NULL,
created DATETIME NOT NULL
)
PARTITION BY HASH (serverid)
PARTITIONS 10
30. Partition
• KEY
30
CREATE TABLE serverlogs4 (
serverid INT NOT NULL,
logdata BLOB NOT NULL,
created DATETIME NOT NULL,
UNIQUE KEY (serverid)
)
PARTITION BY KEY() PARTITIONS 10;
31. Partition
• RANGE
31
CREATE TABLE userslogs (
username VARCHAR(20) NOT NULL,
logdata BLOB NOT NULL,
created DATETIME NOT NULL,
PRIMARY KEY(username, created)
)
PARTITION BY RANGE( YEAR(created) )(
PARTITION from_2013_or_less VALUES LESS THAN (2014),
PARTITION from_2014 VALUES LESS THAN (2015),
PARTITION from_2015 VALUES LESS THAN (2016),
PARTITION from_2016_and_up VALUES LESS THAN MAXVALUE
35. Tổng hợp
• Chuẩn chưa hản đã tốt nhưng nên thiết chuẩn
từ đầu
• Khi cần bỏ chuẩn hóa cần chú ý những phần
đang sử dụng.
• Tránh thay đổi những bảng cũ mà nên tìm cách
thêm bảng mới
• Nên dùng trigger thay cho đổi logic code
• Partition là phương pháp hiệu quả nhưng chỉ
nên sử dụng với dữ liệu lớn
35