2018-11-28

MySQL và Database - Vài điều hay ho - Phần 1

MySQL và Database - Vài điều hay ho - Phần 1

1. Tản mạn ngoài lề


MySQL với DB thì có cái quần què gì chứ?
Đọc thôi để thấy cũng vài cái hay ho và này nọ.

2. MySQL: MyISAM & InnoDB & Memory

Chúng ta đã biết MySQL là hệ quản trị cơ sở dữ liệu miễn phí được sử dụng nhiều trong PHP. Khi tạo bảng trong MySQL sẽ có nhiều kiểu Storage Engine để lựa chọn. MyIsam & Innodb & Memory là 3 thằng sử dụng nhiều nhất. Thử tìm hiểu về chúng xem.
a. MyISAM
Đây là kiểu Storage Engine mặc định khi tạo bảng và được dùng phổ biết nhất. Storage Engine này cho phép lập chỉ mục toàn cột (Full-text search indexes). Do đó, Storage Engine này cho tốc độ truy suất(Đọc và tìm kiếm) nhanh trong các Storage Engine.
Nhược điểm của MyISAM là sử dụng cơ chế table-level locking nên khi cập nhật (Thêm,xóa,sửa) 1 bản ghi nào đó trong cùng 1 table thì table đó sẽ bị khóa lại, không cho cập nhật (Thêm,xóa,sửa) cho đến khi thao tác cập nhật trước đó thực hiện xong.
b. InnoDB 
Không như trước đây, giờ đây InnoDB cũng đã hỗ trợ Full-text search indexes từ phiên bản 5.6. Và thêm cái hay nữa là nó hỗ trợ khóa ngoại Foreign key.
Tốc độ insert/update/delete tốt nhất do hoạt động theo cơ chế Row Level Locking nên khi cập nhật (Thêm,xóa,sửa) 1 bảng thì chỉ có bản ghi đang bị thao tác bị khóa mà thôi, các hoạt động khác trên table này vẫn diễn ra bình thường.
c. MEMORY
MEMORY engine (HEAP) là engine phù hợp nhất cho việc truy cập dữ liệu nhanh, vì mọi thứ đều được lưu trữ trong RAM. Khi khởi động lại MySQL hay Server, tất cả dữ liệu sẽ bị xóa hết.

Vậy thì
  • Dùng MyISAM với những thằng có tần suất đọc cao như 24h, vnexpress, blog, ...
  • Dùng InnoDB với những thằng hay động vào DB như Diễn đàn, Mạng xã hội, ...
  • Dùng MEMORY cho các table chứa dữ liệu tạm và thông tin phiên làm việc của người dùng (Session)

3. Một số thao tác với SQL

Cái này khá easy. Mình chỉ xin liệt kê một số cái mà ai cũng đã biết :D.
Dữ liệu
SELECT ; INSERT ; UPDATE ; DELETE ; REPLACE ; TRUNCATE TABLE
Giao dịch
START TRANSACTION ; COMMIT ; ROLLBACK
(^-^) Một số thủ thuật tối ưu câu lệnh SQL
  • Nghiêm cấm select *. 10 ông thì quá nửa ông bị kiểu này. Cái DB be bé xinh xinh thì không sao. To đùng phát chết luôn.
Nhẹ hơn select * là vấn đề làm sao tối ưu câu query, giống như việc tối ưu code ấy. Làm sao để không xảy ra tình trạng Dư thừa dữ liệu
  • Thêm WHERE trong câu lệnh sql.
  • Hạn chế dùng DISTINCT nếu không thật sự cần thiết. Vì nó làm chậm quá trình truy vấn dữ liệu.
  • Nếu bạn có sự chọn lựa giữa IN và EXISTS trong câu truy vấn, khi mà kết quả của sub-query lớn, bạn hãy chọn EXISTS là tốt nhất. Tương tự như IN và BETWEEN, hãy chọn BETWEEN.
  • Bạn hãy cố gắng tránh sử dụng các toán tử sau trong mệnh đề WHERE: IS NULL<>!=!>!<NOTNOT EXISTSNOT INNOT LIKE, and LIKE /'%abc'. Vì những toán tử này nó không sử dụng đặc tính index mà thay vì thế nó sẽ dò tìm toàn bảng gây ảnh hưởng đến tốc độ của câu truy vấn.
  • Nên dùng LIMIT hoặc TOP khi cần thiết. Ví dụ bạn chỉ cần dùng 100 record để xử lý thì cũng không cần thiết phải lấy hết dữ liệu trong DB ra làm gì.
  • So với việc dùng <= thì việc dùng < thì tốt hơn.
    Ví dụ
    select name from member where year < 1992
    
    sẽ tốt hơn là
    select name from member where year <= 1991
    
  • Nếu trong truy vấn có HAVING thì nên sử dụng WHERE để hạn chế những hàng không cần thiết.
  • Trong truy vấn nếu có một hoặc nhiều OR thì có thể viết lại bằng cách sử dụng UNION ALL.
    SELECT employeeID, firstname, lastname
    FROM Employees
    WHERE dept = 'prod' or city = 'Orlando' or division = 'food' 
    
    có thể viết lại
    SELECT employeeID, firstname, lastname FROM Employees WHERE dept = 'prod'
    UNION ALL
    SELECT employeeID, firstname, lastname FROM Employees WHERE city = 'Orlando'
    UNION ALL
    SELECT employeeID, firstname, lastname FROM Employees WHERE division = 'food' 
    
Để tìm hiểu kỹ hơn về SQL thì bạn có thể vào đây
Thời đại 4.0 đến rồi. Giờ cái gì cũng hỗ trợ, tối ưu, đơn giản hóa cả. Ngay cả việc query SQL cũng đã có những bước tiến vượt bậc. Cùng tìm hiểu thôi nào!!!

4. ORM

Hiểu một cách đơn giản ORM (Object Relational Mapping), là một kỹ thuật/cơ chế lập trình thực hiện ánh xạ CSDL sang các đối tượng trong các ngôn ngữ lập trình hướng đối tượng.
Ví dụ thay vì
select * from flights where active = 1 order by name desc limit 10;
Thì trong Eloquent Laravel
$flights = App\Flight::where('active', 1)
               ->orderBy('name', 'desc')
               ->take(10)
               ->get();
Nói về ưu điểm của ORM thì nhiều lắm, có thể kể đến
  • OOP
  • Nó có thể làm việc được với nhiều loại database, nhiều kiểu dữ liệu khác nhau.
  • Đơn giản, dễ sử dụng, có thể tái sử dụng.
  • Code ngắn hơn, đọc phát hiểu luôn. Và đặc biệt rất thuận tiện trong các case CRUD (Create, Read, Update, Delete)
  • Có thể không cần học sql =)). Thực tế là có thể dùng ORM mà không biết gì về SQL.
Câu hỏi ngược lại. Có thật là không cần học SQL thuần không?
Vẫn có nhé. Vì bản chất ORM cũng từ SQL mà sinh ra.
Còn có một vấn đề nữa là với những câu Query phức tạp (đặc biệt là liên quan đến join các bảng) thì ORM khó xử lý, lúc này phải dùng đến các câu Sql củ chuối đó. Một điểm trừ cho ORM.
Tối ưu hóa các câu lệnh SQL là điều nên làm đối với các dữ liệu lớn, tuy nhiên đối với ORM quá trình này rất khó khăn và phức tạp, bởi vì bạn phải tuân theo thiết kế của ORM .

5. Tóm lại

Phần này mình chỉ nói về MySQL, ORM
Sẽ có phần 2 nói về Database.
Cùng đón chờ vài điều hay ho nữa.
Hãy để lại ý kiến của bản thân đóng góp cho bài viết để bài viết hoàn chỉnh hơn.