Mysql
-
- 1、索引
- 2、索引存储的格式是key,value (key表示索引字段,value表示行记录)
- 3、B+树他是多少层
- 4、在数据库中选择索引或者key值的时候,使用的是int类型还是varchar类型的
- 5、聚簇索引和非聚簇索引
- 6、索引的优点缺点,使用索引一定会提高性能么
- 7、为什么只能有一个聚簇索引
- 8、回表:回表的效率底,少用回表
- 9、索引覆盖:推荐使用
- 10、这边插入一个问题:主键要不要自增还是UUID
- 11、那如何避免回表呢?
- 12、最左匹配:创建索引的时候,一般都是单列;可以选择多个列共同组成索引,这就叫组合索引,联合索引需要遵守最左匹配原则
- 13、 索引下推:5.7之后默认开启支持
- 14、海量数据下,如何快速查找到一条记录
- 15、 索引的分类
- 16、数据库表很大,对性能有影响么
- 17、索引失效(哪种情况不使用索引)
- 18、创建索引的注意事项
- 19、sql优化
- 20、MVCC
- 21、锁
- 22、sql语句
- 23、ACID底层通过什么实现(事务的实现原理)(mysql的日志)
- 24、mysql的binlog二进制日志
- 25、事务的隔离级别
- 26、存储引擎的使用场景
- 27、性别不适合建立索引
- 28、普通索引和唯一索引的区别
- 29、mysql中的varchar和char的区别
1、索引
- 索引->数据结构(B+,hash),设计原则,优化,失效,回表,索引覆盖,最左匹配,索引下推,聚簇索引
- 集群:主从复制,读写分离,分库分表
- sql优化,存储引擎,事务,锁,MVCC,日志,
- mysql的架构体系:存储引擎才是实际存储数据的地方
- 分库,分表用sharding-sphere(归属于apache了)和mycat(了解即可)
- explain+sql语句可以查看执行计划,sql语句的执行效率如何,在那块可以做索引优化
- 根据ID,看执行优先级
- select_type:simple是简单查询,primary是复杂查询
- type类型:system>const>ref>range>index>all
- key:查看使用的索引
- type
- const->表 中有匹配行select * from emp where name=12
- eq_ref->唯一索引做数据查找select * from emp,emp2 where emp.empno=emp2.empno
- ref->非唯一索引做数据查找select * from dept,emp where dept.deptno=emp.deptno
- range->索引做范围查找select * from emp where empno=12
- index->索引做全表扫描select empno from emp;
- 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+树他是多少层
- 一般情况下,3到4层的B+数,足以支持千万级别的数据量存储
4、在数据库中选择索引或者key值的时候,使用的是int类型还是varchar类型的
- 我们要让key尽可能少的占用数据空间
- 当varchar(数字)当数字小于4时,使用int,反之用varchar
5、聚簇索引和非聚簇索引
-
聚簇索引:数据和索引存储在一起的,存储引擎是innodb的,数据必须和某个索引绑定在一起,绑定数据的索引(主键->唯一索引->6字节的rowid这是MVCC里的隐藏的主键,用户不可见)是聚簇索引,那其他索引的叶子结点中存储的数据不再是整行记录,而是对应的聚簇索引的主键的key值(如果ID是主键,放的就是1,2…),这些就是非聚簇索引
-
非聚簇索引:数据和索引没有存在一起,存储引擎是myisam的,
-
所以:innodb既有聚簇索引,又有非聚簇索引;myisam中只有非聚簇索引
6、索引的优点缺点,使用索引一定会提高性能么
- 优点:加锁查询效率
- 缺点:索引要维护,费时费力,索引存储占用空间
- 当一个数据库中又大量的重复数据时,就没必要用索引
- 当一个表的数据量不大,几百/几千条就不需要用索引
7、为什么只能有一个聚簇索引
- 聚簇是索引和数据绑定在一起的呀
- 如果有n个聚簇索引的话,就需要有n份数据
- 这样数据不就冗余了么
8、回表:回表的效率底,少用回表
- id,name,age,gender;其中id是主键,name是唯一索引
- select * from student where name=“zhangsan”;
- sql语句的检索过程:
- 根据索引name找到对应的聚簇索引的key值
- 再根据key值,找到对应的整行data记录
- 这个过程叫做回表
9、索引覆盖:推荐使用
- id,name,age,gender;其中id是主键,name是唯一索引
- select id,name from student where name=“zhangsan”;
- sql语句的检索过程
- 根据索引可以直接查询到id,name的值(都根据key值拿到,key就是字段下面的数据),不再需要根据聚簇索引查询,这就是索引覆盖
10、这边插入一个问题:主键要不要自增还是UUID
- UUID是随机的,存入主键时可能会存储到树的中间位置,调整树的代价太大
- 使用int型的自增,直接在树后面append追加,对树的影响较小,而且聚簇索引很大时,非聚簇索引也会较大,IO每次读取量会变大&#x