项目笔记总结-Mysql

本文深入探讨了MySQL的索引原理,包括B+树结构、索引类型(如聚簇与非聚簇索引)、索引的优缺点、回表与索引覆盖。此外,还讲解了如何避免回表、最左匹配原则、索引下推优化以及如何在海量数据中快速查询。同时,文章提到了主键选择自增ID而非UUID的原因,以及SQL优化、事务隔离级别、MVCC机制、锁的使用和存储引擎的选择场景。
摘要由CSDN通过智能技术生成

1、索引

  1. 索引->数据结构(B+,hash),设计原则,优化,失效,回表,索引覆盖,最左匹配,索引下推,聚簇索引
  2. 集群:主从复制,读写分离,分库分表
  3. sql优化,存储引擎,事务,锁,MVCC,日志,
  4. mysql的架构体系:存储引擎才是实际存储数据的地方
  5. 分库,分表用sharding-sphere(归属于apache了)和mycat(了解即可)
  6. explain+sql语句可以查看执行计划,sql语句的执行效率如何,在那块可以做索引优化
  1. 根据ID,看执行优先级
  2. select_type:simple是简单查询,primary是复杂查询
  3. type类型:system>const>ref>range>index>all
  4. key:查看使用的索引

  1. type
  2. const->表 中有匹配行select * from emp where name=12
  3. eq_ref->唯一索引做数据查找select * from emp,emp2 where emp.empno=emp2.empno
  4. ref->非唯一索引做数据查找select * from dept,emp where dept.deptno=emp.deptno
  5. range->索引做范围查找select * from emp where empno=12
  6. index->索引做全表扫描select empno from emp;
  7. all->直接暴力的全表扫描select * from emp;

2、索引存储的格式是key,value (key表示索引字段,value表示行记录)

1.数据在磁盘上,他寻址的速度是微妙,内存的寻址速度是纳秒,查了十万八千倍
数据存储在磁盘上,如果数据量很大,无法全部一次读取内存,(内存的处理效率明显是高于磁盘的)就需要批量加载,分块去读,就需用用IO读,那么减少IO读取量,减少IO读取次数,就会提高效率
2. 那么怎么存就会让查询读的效率更高?那就看使用怎样的数据结构了
2. 为什么使用哈希呢?当哈希算法不友好的话,就导致数据散列不均匀,哈希碰撞之类的,而且无法范围查找时,效率很低
3. 普通的什么二叉树,平衡二叉树红黑树(有序,平衡)他们都是有且只有两个结点,当数据很多时,就会导致这个树很深,就表示IO读取的次数会很多,从硬盘到内存读数据时,效率就底,所以就是用B+树:
1. 第一是为了降低树的深度
2. 第二是将结点上的单个数据变成多个区间,区间越多,检索效率就越高
3. 非叶子结点存储key值(字段名),叶子结点存储key和值,IO读取量减少
4. 而且叶子结点之间通过指针相互连接,基于索引的顺序扫描,指针左右快速左右移动,效率很高

3、B+树他是多少层

  1. 一般情况下,3到4层的B+数,足以支持千万级别的数据量存储

4、在数据库中选择索引或者key值的时候,使用的是int类型还是varchar类型的

  1. 我们要让key尽可能少的占用数据空间
  2. 当varchar(数字)当数字小于4时,使用int,反之用varchar

5、聚簇索引和非聚簇索引

  1. 聚簇索引:数据和索引存储在一起的,存储引擎是innodb的,数据必须和某个索引绑定在一起,绑定数据的索引(主键->唯一索引->6字节的rowid这是MVCC里的隐藏的主键,用户不可见)是聚簇索引,那其他索引的叶子结点中存储的数据不再是整行记录,而是对应的聚簇索引的主键的key值(如果ID是主键,放的就是1,2…),这些就是非聚簇索引

  2. 非聚簇索引:数据和索引没有存在一起,存储引擎是myisam的,

  3. 所以:innodb既有聚簇索引,又有非聚簇索引;myisam中只有非聚簇索引

6、索引的优点缺点,使用索引一定会提高性能么

  1. 优点:加锁查询效率
  2. 缺点:索引要维护,费时费力,索引存储占用空间
  3. 当一个数据库中又大量的重复数据时,就没必要用索引
  4. 当一个表的数据量不大,几百/几千条就不需要用索引

7、为什么只能有一个聚簇索引

  1. 聚簇是索引和数据绑定在一起的呀
  2. 如果有n个聚簇索引的话,就需要有n份数据
  3. 这样数据不就冗余了么

8、回表:回表的效率底,少用回表

  1. id,name,age,gender;其中id是主键,name是唯一索引
  2. select * from student where name=“zhangsan”;

  1. sql语句的检索过程:
  2. 根据索引name找到对应的聚簇索引的key值
  3. 再根据key值,找到对应的整行data记录
  4. 这个过程叫做回表

9、索引覆盖:推荐使用

  1. id,name,age,gender;其中id是主键,name是唯一索引
  2. select id,name from student where name=“zhangsan”;

  1. sql语句的检索过程
  2. 根据索引可以直接查询到id,name的值(都根据key值拿到,key就是字段下面的数据),不再需要根据聚簇索引查询,这就是索引覆盖

10、这边插入一个问题:主键要不要自增还是UUID

  1. UUID是随机的,存入主键时可能会存储到树的中间位置,调整树的代价太大
  2. 使用int型的自增,直接在树后面append追加,对树的影响较小,而且聚簇索引很大时,非聚簇索引也会较大,IO每次读取量会变大&#x
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值