MySQL索引初探

本文深入探讨了各种数据库索引类型,如二叉树、红黑树、哈希表和B-Tree、B+Tree,分析了它们的特性与应用场景。针对索引可能导致的查询效率问题,提出了优化策略,包括表设计、SQL优化和配置调整。同时,介绍了执行计划的解析,以及如何通过EXPLAIN命令理解查询执行过程。最后,提到了分库分表作为解决大数据量场景下的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

索引数据结构

二叉树
  • 每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。
  • 左子树和右子树是有顺序的,次序不能任意颠倒。
  • 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。

问题:某些情况会变成链表

红黑树

一个平衡二叉树

  • 结点是红色或黑色。
  • 根结点是黑色。
  • 所有叶子都是黑色。叶子是NIL结点
  • 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)
  • 从任一节结点其每个叶子的所有路径都包含相同数目的黑色结点
    在这里插入图片描述

问题:深度太高

Hash表
  • 对索引的key进行一次hash计算就可以定位出数据存储的位置
  • 很多时候Hash索引要比B+ 树索引更高效
  • 仅能满足 “=”,“IN”,不支持范围查询
  • hash冲突问题
    在这里插入图片描述
    问题:范围无法查询
B-Tree

多路树
在这里插入图片描述

B+Tree
  • 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
  • 叶子节点包含所有索引字段
  • 叶子节点用指针连接,提高区间访问的性能
    在这里插入图片描述

聚集索引和非聚集索引

  • ibd: InnoDB Index+Data
  • MYI : MyISAM Index
  • MYD: MyISAM Data
  • frm:表结构
    在这里插入图片描述
聚集索引-叶节点包含了完整的数据记录

在这里插入图片描述
在这里插入图片描述

非聚集索引-索引文件和数据文件是分离的

在这里插入图片描述

最左前缀原则

在这里插入图片描述

执行计划

MySQL官网优化索引文档
MySQL官网explain文档
MySQL官网explain-output文档

执行计划EXPLAIN
mysql> EXPLAIN SELECT COUNT(*) FROM t1 WHERE i1 = 3 AND d = '2000-01-01'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
         type: ref
possible_keys: PRIMARY,k_d
          key: k_d
      key_len: 4
          ref: const
         rows: 5
        Extra: Using where; Using index

执行计划的每个参数:

Table 8.1 EXPLAIN Output Columns

ColumnJSON NameMeaning
idselect_idThe SELECT identifier
select_typeNoneThe SELECT type
tabletable_nameThe table for the output row
partitionspartitionsThe matching partitions
typeaccess_typeThe join type
possible_keyspossible_keysThe possible indexes to choose
keykeyThe index actually chosen
key_lenkey_lengthThe length of the chosen key
refrefThe columns compared to the index
rowsrowsEstimate of rows to be examined
filteredfilteredPercentage of rows filtered by table condition
ExtraNoneAdditional information
  • id: 这个执行计划的唯一编号
  • select_type: 查询类型
select_type ValueJSON NameMeaning
SIMPLENoneSimple SELECT (not using UNION or subqueries)
PRIMARYNoneOutermost SELECT
UNIONNoneSecond or later SELECT statement in a UNION
DEPENDENT UNIONdependent (true)Second or later SELECT statement in a UNION, dependent on outer query
UNION RESULTunion_resultResult of a UNION.
SUBQUERYNoneFirst SELECT in subquery
DEPENDENT SUBQUERYdependent (true)First SELECT in subquery, dependent on outer query
DERIVEDNoneDerived table
MATERIALIZEDmaterialized_from_subqueryMaterialized subquery
UNCACHEABLE SUBQUERYcacheable (false)A subquery for which the result cannot be cached and must be re-evaluated for each row of the outer query
UNCACHEABLE UNIONcacheable (false)The second or later select in a UNION that belongs to an uncacheable subquery (see UNCACHEABLE SUBQUERY)
  • table: 涉及到的表
  • type: 查询类型
  • possible_keys: PRIMARY,k_d
  • key: 所走的索引
  • key_len: 索引的字节长度和
  • ref:
  • rows: 扫描多少行
  • Extra: 一些关键描述
    比如是否走索引,排序方式,group by方式 ,联表方式等

优化思路

1、表设计优化
2、表结构优化
3、sql优化
4、配置优化

innodb配置参数

例如:

# 查看innodb_buffer_pool_size大小
show VARIABLES like '%innodb_buffer_pool_size%';

#临时的,持久的需要放到配置文件mysql.cnf
SET GLOBAL innodb_buffer_pool_size=1326531840;
SET GLOBAL innodb_buffer_pool_size=134217728;

#测试sql
select e.error_msg from qc_first_page_analysis a left join qc_error_item e on a.mrm_first_page_id = e.mrm_first_page_id group by e.error_msg order by null;

5、分库分表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

年迈程序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值