MySQL优化

MySQL优化

1、索引的数据结构
  1. 索引是帮助MySQL高效获取数据的排好序的数据结构
  2. B Tree的特点
    1. 度(Degree)节点的数据存储个数限制
    2. 叶节点具有相同的深度且指针为空
    3. 节点中的key从左至右递增
  3. B+Tree的特点
    1. 非叶子节点只存储索引
    2. 叶子节点data域存放数据
    3. 叶子节点用双向指针连接
2、非聚集索引 聚集索引

1、聚集索引

  1. ​ 叶子节点 data 域记录着完整的数据记录,这种索引方式被称为聚集索引。
  2. ​ 聚集索引会对磁盘上实际数据按照一个或多个列的值排序进行重新组织,存储数据的顺序和索引顺序一致。
  3. ​ 一般情况下主键会创建聚集索引,一张表只存在一个聚集索引。

2、非聚集索引

  1. 在检索时,首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则按照 data 域的值读取相应的数据记录,这被称为“非聚集索引”。
  2. InnoDB的非聚集索引的叶子节点的 data 域记录着主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主索引中进行查找。
  3. MyISAM的非聚集索引叶子节点的data域记录着是物理地址
3、uuid为什么不适合做索引
  1. 字符相比于int类型查询要慢
  2. 索引插入时要进行分裂和平衡影响性能
  3. 冗余节点占用更多的磁盘空间
4、为什么要给表添加整型自增主键
  1. ​ 表需要主键来组织索引
  2. ​ int类型便于快速查找
  3. ​ 自增是为了减少B+Tree的分裂与平衡
5、哪些列适合使用索引
  1. 主键添加聚集索引 外键添加非聚集索引
  2. 数据量较大的表添加索引
  3. where关键词后经常使用的列
  4. 列数据重复率低
6、explain
  1. id 序号大的优先执行 序号相同由上向下执行

  2. select_type simple primary与subquery(子查询) primary与union(连接查询) primary与derived(临时表)

  3. type 的顺序是system > const > eq_ref > ref > range > index> All

    关键字出现条件例证速记
    system表只有一行记录
    const单表primarykey或unique 索引等值操作[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tcoRaFsH-1584771773628)(C:\Users\Administrator\Desktop\const.png)]单表唯一等值操作
    eq_ref多表连接查询primarykey或unique 索引等值操作 且主表设置为多的一方[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RHkheQWt-1584771773631)(C:\Users\Administrator\Desktop\eq_ref.png)]多表唯一等值操作主表为多
    ref非primarykey或unique 索引的等值操作[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YkMPpqVc-1584771773633)(C:\Users\Administrator\Desktop\80e7518e34f7175441dff9d0c1ca794.png)]不唯一 等值操作
    range聚集索引的bettween、大于小于操作总是range类型 非聚集索引的between、大于小于可能会因为回表过多会在range与all之间切换[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-irHqMlWX-1584771773634)(C:\Users\Administrator\Desktop\range.png)]between 、大于小于
    index主要是查询的列在索引中(包括主键与非聚集索引)。因为只遍历索引树,而索引文件通常比数据文件小,所以比all快速[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pn8uUlpe-1584771773637)(C:\Users\Administrator\Desktop\index.png)]看查询的列有没有加索引
    all遍历全表以找到匹配的行
7、小表驱动大表

1、MySQL 表关联是以驱动表的结果集作为循环基础,然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,最后合并结果

2、如果没信心就是用92语法让MySQL决定谁作为驱动表

3、常规条件下emp的数量多余dept的行数 使用in更好 小表在子查询中

select * from emp where deptno in(select deptno from dept)

4、exist语法可以这样理解将主查询结果集中的数据放在子查询中做验证根据返回的true和false决定是否保留主查询中的数据 此时因为emp数量多 不适合作为驱动表

select * from emp where exists (select 1 from dept where emp.deptno=dept.deptno)

ect * from emp where exists (select 1 from dept where emp.deptno=dept.deptno)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值