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)


你可能感兴趣的:(MySQL优化)