From 3af7abfcd9534b75361cd6f4a0747b14731aa836 Mon Sep 17 00:00:00 2001 From: Guide Date: Wed, 17 Jan 2024 18:12:08 +0800 Subject: [PATCH] =?UTF-8?q?[docs=20update]=E8=A6=86=E7=9B=96=E7=B4=A2?= =?UTF-8?q?=E5=BC=95=E4=BB=8B=E7=BB=8D=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ance-optimization-specification-recommendations.md | 2 +- docs/database/mysql/mysql-questions-01.md | 4 ++++ docs/high-performance/deep-pagination-optimization.md | 11 ++++++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/docs/database/mysql/mysql-high-performance-optimization-specification-recommendations.md b/docs/database/mysql/mysql-high-performance-optimization-specification-recommendations.md index dc6a49fc..c402fcff 100644 --- a/docs/database/mysql/mysql-high-performance-optimization-specification-recommendations.md +++ b/docs/database/mysql/mysql-high-performance-optimization-specification-recommendations.md @@ -213,7 +213,7 @@ InnoDB 是按照主键索引的顺序来组织表的 **覆盖索引的好处:** -- **避免 InnoDB 表进行索引的二次查询:** InnoDB 是以聚集索引的顺序来存储的,对于 InnoDB 来说,二级索引在叶子节点中所保存的是行的主键信息,如果是用二级索引查询数据的话,在查找到相应的键值后,还要通过主键进行二次查询才能获取我们真实所需要的数据。而在覆盖索引中,二级索引的键值中可以获取所有的数据,避免了对主键的二次查询 ,减少了 IO 操作,提升了查询效率。 +- **避免 InnoDB 表进行索引的二次查询,也就是回表操作:** InnoDB 是以聚集索引的顺序来存储的,对于 InnoDB 来说,二级索引在叶子节点中所保存的是行的主键信息,如果是用二级索引查询数据的话,在查找到相应的键值后,还要通过主键进行二次查询才能获取我们真实所需要的数据。而在覆盖索引中,二级索引的键值中可以获取所有的数据,避免了对主键的二次查询(回表),减少了 IO 操作,提升了查询效率。 - **可以把随机 IO 变成顺序 IO 加快查询效率:** 由于覆盖索引是按键值的顺序存储的,对于 IO 密集型的范围查找来说,对比随机从磁盘读取每一行的数据 IO 要少的多,因此利用覆盖索引在访问时也可以把磁盘的随机读取的 IO 转变成索引查找的顺序 IO。 --- diff --git a/docs/database/mysql/mysql-questions-01.md b/docs/database/mysql/mysql-questions-01.md index a547b3cc..9a202dc2 100644 --- a/docs/database/mysql/mysql-questions-01.md +++ b/docs/database/mysql/mysql-questions-01.md @@ -811,6 +811,10 @@ mysql> EXPLAIN SELECT `score`,`name` FROM `cus_order` ORDER BY `score` DESC; 读写分离和分库分表相关的问题比较多,于是,我单独写了一篇文章来介绍:[读写分离和分库分表详解](../../high-performance/read-and-write-separation-and-library-subtable.md)。 +### 深度分页如何优化? + +[深度分页介绍及优化建议](../../high-performance/deep-pagination-optimization.md) + ## MySQL 学习资料推荐 [**书籍推荐**](../../books/database.md#mysql) 。 diff --git a/docs/high-performance/deep-pagination-optimization.md b/docs/high-performance/deep-pagination-optimization.md index 1de7468b..094c26a8 100644 --- a/docs/high-performance/deep-pagination-optimization.md +++ b/docs/high-performance/deep-pagination-optimization.md @@ -68,12 +68,17 @@ LIMIT 10; ### 覆盖索引 -覆盖索引是指查询的结果可以直接从索引中获取,不需要回表查询。这样可以减少随机 IO 的次数,提高查询速度。 +索引中已经包含了所有需要获取的字段的查询方式称为覆盖索引。 + +**覆盖索引的好处:** + +- **避免 InnoDB 表进行索引的二次查询,也就是回表操作:** InnoDB 是以聚集索引的顺序来存储的,对于 InnoDB 来说,二级索引在叶子节点中所保存的是行的主键信息,如果是用二级索引查询数据的话,在查找到相应的键值后,还要通过主键进行二次查询才能获取我们真实所需要的数据。而在覆盖索引中,二级索引的键值中可以获取所有的数据,避免了对主键的二次查询(回表),减少了 IO 操作,提升了查询效率。 +- **可以把随机 IO 变成顺序 IO 加快查询效率:** 由于覆盖索引是按键值的顺序存储的,对于 IO 密集型的范围查找来说,对比随机从磁盘读取每一行的数据 IO 要少的多,因此利用覆盖索引在访问时也可以把磁盘的随机读取的 IO 转变成索引查找的顺序 IO。 ```sql # 如果只需要查询 id, code, type 这三列,可建立 code 和 type 的覆盖索引 -SELECT id, code, type, FROM t_order -ORDER BY text +SELECT id, code, type FROM t_order +ORDER BY code LIMIT 1000000, 10; ```