日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql延迟关联为什么快_MySQL 覆盖索引与延迟关联详解

發(fā)布時(shí)間:2023/12/10 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql延迟关联为什么快_MySQL 覆盖索引与延迟关联详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本期來(lái)談?wù)劯采w索引與延遲關(guān)聯(lián)。在此之前,我們先簡(jiǎn)單建立一個(gè)訂單表 Orders 用于舉例說(shuō)明。表中共包含 3 個(gè)字段:

id

int

product_id

name

CREATE

TABLE

`orders`

`id`

int

10

NOT

NULL

COMMENT

'訂單?ID'

`product_id`

int

10

DEFAULT

NULL

COMMENT

'商品?ID'

`name`

varchar

255

CHARACTER

SET

COLLATE

DEFAULT

NULL

COMMENT

'訂單名稱'

KEY

`id`

KEY

`product_idx`

`product_id`

USING

ENGINE

InnoDB

DEFAULT

CHARSET

COLLATE

覆蓋索引

什么是覆蓋索引?

根據(jù)索引

不包含

覆蓋索引

MyISAM

product_id

SELECT product_id FROM orders

EXPLAIN

SELECT

FROM

----+-------------+--------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+

----+-------------+--------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+

----+-------------+--------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+

set

0.00

id

SELECT id, product_id FROM orders WHERE product_id = 1

product_id

product_id = 1

通過(guò)該子結(jié)點(diǎn)指針讀取磁盤上的數(shù)據(jù)行

id

由于 MyISAM 的葉子結(jié)點(diǎn)存儲(chǔ)著指向數(shù)據(jù)行的指針,該查詢多了一步回表操作,無(wú)法使用覆蓋索引。

EXPLAIN

SELECT

id

FROM

WHERE

1

----+-------------+--------+------------+------+---------------+-------------+---------+-------+------+----------+-------+

----+-------------+--------+------------+------+---------------+-------------+---------+-------+------+----------+-------+

----+-------------+--------+------------+------+---------------+-------------+---------+-------+------+----------+-------+

set

0.00

MyISAM 索引結(jié)構(gòu)

InnoDB

二級(jí)索引的葉子結(jié)點(diǎn)保存著行的主鍵值

InnoDB 二級(jí)索引的葉子結(jié)點(diǎn)包含行主鍵值

SELECT id, product_id FROM orders WHERE product_id = 1

EXPLAIN

SELECT

id

FROM

WHERE

1

----+-------------+--------+------------+------+---------------+-------------+---------+-------+------+----------+-------------+

----+-------------+--------+------------+------+---------------+-------------+---------+-------+------+----------+-------------+

----+-------------+--------+------------+------+---------------+-------------+---------+-------+------+----------+-------------+

set

0.01

Extra

Using index

product_id

product_id = 1

id

查詢軌跡并未進(jìn)行回表取值。

延遲關(guān)聯(lián)

deferred join

在查詢的第一階段 MySQL 使用覆蓋索引,再通過(guò)該覆蓋索引查詢到的結(jié)果到外層查詢匹配需要的所有列值。

這樣說(shuō)有些抽象,我們來(lái)看看下面的例子。

用延遲關(guān)聯(lián)優(yōu)化分頁(yè)(LIMIT)

LIMIT

LIMIT 10000, 20

EXPLAIN

SELECT

FROM

LIMIT

10000

20

----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------+

----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------+

----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------+

盡可能使用索引覆蓋掃描,而不是查詢所有列

EXPLAIN

SELECT

FROM

AS

JOIN

SELECT

id

FROM

LIMIT

10000

20

AS

ON

----+-------------+------------+------------+-------+---------------+-------------+---------+------------+------+----------+-------------+

----+-------------+------------+------------+-------+---------------+-------------+---------+------------+------+----------+-------------+

----+-------------+------------+------------+-------+---------------+-------------+---------+------------+------+----------+-------------+

這樣一來(lái),MySQL 在 SQL 語(yǔ)句的「內(nèi)層」進(jìn)行掃描時(shí)使用了覆蓋索引,「外層」再通過(guò)索引樹找到相關(guān)的數(shù)據(jù)行,直接減少了掃描的數(shù)據(jù)量。

總結(jié)

只需掃描索引,無(wú)須回表

deferred join

參考資料

《高性能 MySQL》

[1]

參考資料

[1]

https://book.douban.com/subject/23008813/

更多閱讀

5分鐘掌握在 Cython 中使用 C++

5 分鐘掌握 Python 中常見的配置文件

5 分鐘掌握 Python 中的 Hook 鉤子函數(shù)

點(diǎn)擊下方閱讀原文加入

社區(qū)會(huì)員

總結(jié)

以上是生活随笔為你收集整理的mysql延迟关联为什么快_MySQL 覆盖索引与延迟关联详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。