Thứ Tư, 26 tháng 7, 2023

Descending Index trong MySQL

Trong bài này chúng ta sẽ học cách đặt Descending Index trong MySQL, đây là cách đạt chỉ mục giúp cho việc sắp xếp kết quả trả về nhanh chóng hơn.

Thông thường bạn hay sắp xếp tăng dần và giảm dần theo ID kiểu integer với mong muốn tốc độ trả về tối ưu hơn. Tuy nhiên có một số trường hợp bạn muốn sắp xếp theo nhiều field nhưng tốc độ phải nhanh một chút. Đây chính là lúc sử dụng chỉ mục sắp xếp.

Mục lục

  • 1. Giới thiệu Descending Index trong MySQL
  • 2. Ví dụ Descending Index trong MySQL

1. Giới thiệu Descending Index trong MySQL

Descending Index còn gọi là chỉ mục giảm dần, lưu trữ các giá trị theo thứ tự giảm dần. Các phiên bản MySQL 8.0 trở về trước bạn có thể chỉ định DESC trong khai báo chỉ mục, tuy nhiên trong phiên bản MySQL này đã bỏ qua nó.

Thực tế MySQL cũng thể quét chỉ mục theo thứ tự giảm dần nhưng chi phí thực hiện quá cao, hay nói cách khác là không tối ưu.

Bài viết này được đăng tại tranvanbinh.vn

Câu lệnh SQL dưới đây tạo ra một table và một index trong table đó.

1
2
3
4
5
CREATE TABLE t(
    a INT NOT NULL,
    b INT NOT NULL,
    INDEX a_asc_b_desc (a ASC, b DESC)
);

Khi bạn sử dụng lệnh SHOW CREATE TABLE trong MySQL 5.7, bạn sẽ thấy rằng DESC bị bỏ qua như dưới đây:

1
2
3
4
5
6
7
8
9
mysql> SHOW CREATE TABLE t\G;
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `a` int(11) NOT NULL,
  `b` int(11) NOT NULL,
  KEY `a_asc_b_desc` (`a`,`b`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

Bắt đầu từ MySQL 8.0 thì các giá trị được lưu trữ theo thứ tự giảm dần nếu bạn sử dụng từ khóa DESC để tạo chỉ mục.

Sau đây cho thấy cấu trúc bảng trong MySQL 8.0:

1
2
3
4
5
6
7
8
9
mysql> SHOW CREATE TABLE t\G;
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `a` int(11) NOT NULL,
  `b` int(11) NOT NULL,
  KEY `a_asc_b_desc` (`a`,`b` DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

2. Ví dụ Descending Index trong MySQL

Đầu tiên hãy tạo ra bảng t và nhiều index khác nhau như sau:

1
2
3
4
5
6
7
8
9
10
DROP TABLE t;
 
CREATE TABLE t (
    a INT,
    b INT,
    INDEX a_asc_b_asc (a ASC , b ASC),
    INDEX a_asc_b_desc (a ASC , b DESC),
    INDEX a_desc_b_asc (a DESC , b ASC),
    INDEX a_desc_b_desc (a DESC , b DESC)
);

Tiếp theo hãy sử dụng đoạn code SQL Procedure dưới đây để insert 10000 dòng dữ liệu vào table này.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE PROCEDURE insertSampleData(
    IN rowCount INT,
    IN low INT,
    IN high INT
)
BEGIN
    DECLARE counter INT DEFAULT 0;
    REPEAT
        SET counter := counter + 1;
        -- insert data
        INSERT INTO t(a,b)
        VALUES(
            ROUND((RAND() * (high-low))+high),
            ROUND((RAND() * (high-low))+high)
        );
    UNTIL counter >= rowCount
    END REPEAT;
END$$

Chạy lệnh sau để insert:

1
CALL insertSampleData(10000,1,1000);

Bây giờ mình có một vài yêu cầu cụ thể như sau:

Yêu cầu 1: Sắp xếp giảm dần theo hai cột a và b

1
2
3
4
5
EXPLAIN SELECT
    *
FROM
    t
ORDER BY a , b; -- use index a_asc_b_asc

Kết quả:

MySQL Descending Index Example 1 png

Yêu cầu 2: Sắp xếp cột a tăng dần, cột b giảm dần

1
2
3
4
5
EXPLAIN SELECT
    *
FROM
    t
ORDER BY a , b DESC; -- use index a_asc_b_desc

Kêt quả:

MySQL Descending Index Example 2 png

Yêu cầu 3: Sắp xếp cột a giảm dần, cột b tăn dần.

1
2
3
4
5
EXPLAIN SELECT
    *
FROM
    t
ORDER BY a DESC , b; -- use index a_desc_b_asc

Kết quả:

MySQL Descending Index Example 3 png

Như vậy là mình đã hướng dẫn xong cách sử dụng sắp xếp chỉ mục trong MySQL, hay còn gọi là Descending Index trong MySQL. Chúc bạn thực hiện thành công!

=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master