我是小冷 侧重后端的全栈工程师,有关技术问题需要讨论交流的直接私信即可
⏩当前专栏:mysql高手养成系列- 第一章 索引与浅尝性能分析
✏️高质量技术专栏专栏链接: 微服务,数据结构,netty,单点登录,SSM ,SpringCloudAlibaba
前言
和很多高级开发前辈交流的时候,多数人认为数据库是新人工程师经验获取最多的技术,他们认为数据库经验是能决定一个程序员的下限的。
所以相对扎实的数据库基础加上生产环境多变的需求 将 历练自己成为一个数据库高玩,在技术提升的道路上 保证下限提升上线是最稳妥的做法。
于是乎 新的专栏开始了 和小冷来一起稳固自己的楼盘 为之后万丈高楼平地起打下殷实基础
参考资料 :
黑马 mysql:https://www.bilibili.com/video/BV1Kr4y1i7ru
冰河大佬的 《mysql技术大全》
《高性能MySQL(第3版)》
我们在使用mysql的时候 就可以发现 在5.5之后 创建表的默认结构语句会带上engine = innodb 这个是默认的存储引擎。
innodb
是兼顾高性能和高可靠性的通用存储引擎
特点:
MYSQL三种引擎的对比
我们如何去决定需要什么引擎呢?
索引(index)是帮助MySQL 的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
图解
优点:
提高检索效率,降低数据库IO成本,通过索引可以对数据进行排序,降低排序成本减少cpu资源的消耗
缺点:
索引也是占用空间的,索引大大提高了查询效率,但是降低了更新表的速度,对表的增删改效率会变低
为什么innodb要使用b+树来作为索引结构
才用hash算法将键和值转换成心的hash值 映射到对应的位置存在hash表中,如果两个或者多个映射到同一个位置,就会产生hash冲突,可以通过链表来解决
特点
在innodb中 索引的存储形式,可以分为以下两种
聚集索引选取规则:
如果我们需要查找一个人 比如 arm
创建索引
create index index_name on table_name(index_col_name)
查看索引
show index from table_name
删除索引
drop index index_name on table_name
查看sql频次
show global status like 'com%'
可以查看sql的执行次数,来根据结果分析数据库进行优化
慢查询日志
在sql中 慢查询日志是默认不开启的 我们需要自己设置,如果需要可以去修改mysql的配置文件,当有sql执行耗时超过我们设置的时间,我们就会在慢查询日志定位到这些sql
profile
show profiles 可以在sql优化的时候让我们了解时间的消耗都在那里。通过 have_profiling参数,可以看到mysql当前支不支持profile操作
select @@have_profiling
默认的profiling 是关闭的 我们需要通过设置来开启
set profiling = 1
查看一系列业务sql操作的耗时情况
查看耗时基本情况
show PROFILE
查看指定queryid的sql语句各个阶段的耗时情况
show profile for query query_id
查看指定query_id的sql cpu 使用情况
show profile cpu for query query_id
explain sql执行计划分析
id 查询序列号,用来表示多表查询的时候操作表的顺序 (id相同执行顺序从上到下 id 不同值越大越先执行)
如果有用到子查询 就会出现 id 不同的情况 优先执行子查询的sql
他主要对于联合索引有约束,最左前缀是查询从索引的最左列开始,并且不跳过索引中的列,否则索引会失效
我们假设有数据表设置了一个三个字段的联合索引:
从下图执行的两个sql我们可以发现 如果去掉后面的条件,依然会走索引查询,但是不可以跳过中间字段
我们可以这么查 1 2 3
也可以 1 2
但是不可以 1 3
也不可以 2 3
最左前缀法则 必须包含最左边的列 否则不会走索引 ,也不可以跳过列 否则索引会失效