mysql延迟关联为什么快_MySQL 覆盖索引与延迟关联详解
本期來(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)題。
- 上一篇: 简单实现网络验证_电脑计算机编程入门教程
- 下一篇: mysql通过函数完成10的阶乘_请使用