InnoDB索引

其数据文件本身就是索引文件。
相比myISAM,索引文件和数据文件是分离的,表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。
这个索引的key就是数据表的主键,
因此innoDB表数据文件本身就是主索引,被成为聚蔟索引,也叫聚集索引。
其余的索引都为辅助索引,
辅助索引data域存储相应记录主键的值而不是地址。
在根据主索引搜索时,直接找到key所在的节点即可取出数据,
根据辅助索引查找时,需要先取出主键的值,再走一遍主索引,
设计表时,不建议使用过长的字段作为主键,
也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。


通过 explain 命令打印sql语句的执行计划,判断是否命中索引,
type:all 表示全表扫描
key:表示使用的索引,就是主键
extra:using filesort 需要额外的步骤来发现如何对返回的行排序
using temporary 需要创建一个临时表来存储结果,说明查询需要优化

参数说明
id : 表示SQL执行的顺序的标识,SQL从大到小的执行

select_type:表示查询中每个select子句的类型

table:显示这一行的数据是关于哪张表的,有时不是真实的表名字

type:表示MySQL在表中找到所需行的方式,又称“访问类型”。常用的类型有:ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)

possible_keys:指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用

Key:key列显示MySQL实际决定使用的键(索引),如果没有选择索引,键是NULL。

key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)

ref:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

rows:表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数,理论上行数越少,查询性能越好

Extra:该列包含MySQL解决查询的详细信息

EXPLAIN的特性

EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况

EXPLAIN不考虑各种Cache

EXPLAIN不能显示MySQL在执行查询时所作的优化工作

部分统计信息是估算的,并非精确值

EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

当全表扫描,或者索引字段数据重复率太高,将不会使用索引


  • 最左前缀原则
    查询的适合查询条件精确匹配索引的左边连续一列或几列,则此列就可以被用到

  • 避免使用where 子句对字段是假函数,to_date() 等。会造成无法命中索引。

  • 使用与业务无关的自增主键作为主键,即使用逻辑主键,不要使用业务主键

  • 避免冗余索引

  • 索引列为not null, 避免全表扫描

  • 删除不必要的、长期未使用的索引

  • 联表查询使用索引提高性能

  • group by 和order by 中只设计一个表中的列,才有可能使用索引来优化

  • 查询条件的字段应使用正确的数据类型,否则mysql会自动做数据类型转换。导致无法命中索引。


慢查询优化基本步骤

先运行看看是否真的很慢,注意设置SQL_NO_CACHE

where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高

explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)

order by limit 形式的sql语句让排序的表优先查

了解业务方使用场景

加索引时参照建索引的几大原则

观察结果,不符合预期继续从0分析


https://mp.weixin.qq.com/s?__biz=MzI0MjQxNjAyOQ==&mid=2247485299&idx=4&sn=d1e575cdc39de5e842a7d9882d0d150b&chksm=e97de781de0a6e979ce76d49d3fa38d37539cadc70cfdd8762d31c0c51d7da0defd5a30148db&scene=0&xtrack=1#rd

### InnoDB索引工作原理 InnoDB作为MySQL数据库默认的存储引擎之一,提供了多种高级特性如外键完整性约束和支持事务等功能[^1]。在讨论InnoDB索引的工作机制前,有必要理解其基本架构。 #### 聚簇索引(Clustered Index) InnoDB采用聚簇索引来组织表的数据行。这意味着数据行按主键顺序物理地保存在一起;换句话说,在聚簇索引中,叶子节点包含了完整的行记录信息而不是简单的指向实际数据位置的指针。这种设计允许更快地访问连续范围内的多条记录,因为它们通常位于磁盘上的相邻位置[^5]。 #### 辅助索引(Secondary Indexes) 除了聚簇索引之外,还可以创建额外的辅助索引用于加速特定字段上的查询操作。当定义了一个非唯一性的普通索引或者唯一性索引时,实际上是在建立一棵独立于聚簇索引的新B+树结构。值得注意的是,对于每一个这样的辅助索引来说,其叶结点所含有的是指向相应行所在聚簇索引位置的信息——通常是该行的主键值[^2]。 #### B+Tree 结构特点 无论是聚簇还是辅助类型的索引都采用了经典的B+树算法来实现高效检索性能。相比于其他可能的选择(比如哈希表),B+树能够很好地平衡读写效率并支持有序扫描需求。此外,由于内部节点仅包含导航用途的关键字而不涉及具体业务数据项,这有助于保持较低的高度从而减少随机I/O次数。 ### 使用建议与最佳实践 为了充分利用好InnoDB所提供的强大功能,这里给出几点关于如何有效利用索引的小贴士: - **选择合适的主键**:鉴于聚簇索引的重要性,应当谨慎挑选适合做为主键候选者属性集。理想情况下应具备单调增长趋势以降低碎片化程度。 - **考虑复合索引**:如果经常一起使用的几个列频繁出现在WHERE子句条件里,则可尝试构建一个多列组成的联合索引以便提高命中率[^3]。 - **评估覆盖索引的可能性**:尽可能让SQL语句所需全部字段都能被某个已存在或即将新建的索引完全覆盖住,这样就能避免回表动作进而提升执行速度。 ```sql -- 创建一个带有两个字段的复合索引的例子 CREATE INDEX idx_name ON table (column1, column2); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值