MYSQL基础知识归纳(2023首篇)

117 阅读3分钟

「回顾2022,展望2023,我正在参与2022年终总结征文大赛活动

本文章主要适用于温故,可能还涉及到平时收集到的一些知识点给大家分享,如有写的不对的地方请大家一起指正,共同进步。

varchar跟char区别

char:存入数据时,不足长度的补空格,超出长度时截取,读取时则会忽略数据尾部的空格

varchar:存入数据时,会按照数据长度来按实际存入,并且需要空间记录数据真实长度,超出长度时截取。

MySQL常用引擎

-InnoDB引擎

简介:支持行级锁定(行级锁定使InnoDB可以支持更大的并发数)、MVCC多版本控制、非锁定读、事务(ACID)、外键等特性。

  • 使用的是聚集索引(典型的B+树)(查询比mysiam慢是因为普通索引叶子节点存储的是主键值,查询普通索引需要查询俩遍(回表查询)、mvvc检测)
  • 会死锁(逐步获取锁,先锁非主键索引,再锁主键索引,扫描where条件锁定的索引),例子:当两个事务同时执行,一个锁住了主键索引,在等待其他相关索引。另一个锁定了非主键索引,在等待主键索引。这样就会发生死锁。引擎会使其中一个事务回滚解决死锁

-MyISAM引擎

简介:支持表级锁定,并不支持事务,比较适合大量的select和insert操作。

  • 使用的是非聚集索引(B+树但叶子节点存放地址,再根据地址寻找数据)
  • 不会产生死锁(获取锁时一步到位)
  • 表锁读写阻塞,写写阻塞,读读不阻塞

相关锁的概念解释

行级锁:粒度最小,操作冲突低,但加锁慢、开销大,并发高。会死锁(根据where索引检索数据的时候才使用)

页级锁:性能效率居中

表级锁:粒度最大,操作冲突高,但加锁快、开销小,并发低。不会死锁

  • 共享锁(共享读):用于读取数据。事务A加S锁后,其他事务只能加S锁不能加其他锁
  • 排他锁(独占写):用于读取&修改数据。事务A加X锁后,其他事务不能加任何锁
  • 意向读写锁(IS、IX):避免加表锁时跟行锁冲突

死锁发生的原因:行锁加锁顺序不一致导致死锁、没有一次性获取所有资源

解决:建好索引,使SQL定位更少的行。拆分、调整业务逻辑让事务快速提交。以固定顺序访问表和行。尽量按索引查找数据,避免锁表。

索引相关介绍

聚集索引&非聚集索引

聚集索引

优点:主键查询快、范围查询快(存储有序)

缺点:插入慢(redo、undo机制),查询损耗(行锁检测、普通索引回表)

非聚集索引

优点:插入快(没有redo、undo),一页存储更多索引数据

缺点:查询到叶子节点后仍需要查询磁盘找到数据,读写阻塞(没有undo支持),更新时表锁

索引什么时候会失效

  • 联合索引最左匹配原则:按联合索引字段顺序查询。等值放前,范围查询放后索引才生效(查询优化器会把sql where条件调整成最优,所以代码顺序不影响)
  • null值查找
  • <>,not in,not exists不走索引
  • like 前置通配符 % 不走索引
  • 使用函数处理字段后查找不走索引
  • 数据隐式转换
  • 覆盖索引:查询字段是查询条件的索引字段(避免回表查询)
  • or 有一个不走索引则都不走
  • 在进行范围查询时,比如:>、< 、>=、<=等, 如果数据量过大的话,即使where条件字段已经建立了索引,查询语句执行时还是有可能进行全表扫描的。(where条件是主键除外)