常见问题之mysql

  • 有哪些数据类型
    1 整数类型 tinyInt,smallint,mediumint,int(integer)
    2 小数类型 float,double,decimal(m,d)
    3 日期类型 year,time,date,datetime,timestamp
    4 文本,二进制类型 CHAR(M) ,VARCHAR(M),BLOB…
    5 枚举类型

  • 什么是索引
    索引是一种为了更快检索数据库存储数据的一种B+树数据结构

  • 索引的优缺点
    优点:
    a. 提高数据的检索速度,数据检索的时间复杂度为log(n),也就是B+树的高度
    缺点:
    a.每建立一个索引就会产生一颗B+树,需要占用物理空间来存储这个数据结构
    b.索引只有在查询的时候不需要做维护,但是做增/删/改是需要进行维护的,要对B+节点进行修改,降低了数据库修改的效率

  • 索引使用场景
    a. where 条件查询
    b.order by 排序
    c. join on 的连接条件
    d. 能使用覆盖索引的就使用,这样可以不用回溯主键索引,提高效率

  • 索引类型
    a.主键索引,不允许NULL,一个表只能有一个主键索引,主键列不能重复
    b.唯一索引,允许NULL, 一个表可以有多个,索引列不能重复
    c.普通索引,允许NULL, 一个表可以有多个,索引列可以重复
    d.全文索引

  • 创建索引的原则
    a.最左前缀原则,主要是指用组合索引的时候,建立的B+树的排序,就是根据组合的字段的排序去排序的
    b.查询比较频繁的字段才建立索引,维护索引成本还是比较高的
    c.跟新字段比较频繁的时候不适合建立索引,因为涉及到修改,数据要修改,B+树节点也要做调整
    d.可以扩展的索引,就尽量不要去新建索引(组合索引重复使用的情况较多)
    e.字段区分度低的不适合建索引,检索效率提高不明显
    f.索引字段越小越好,这样固定16k的一个节点可以存储更多数据,减少IO次数
    g.索引字段最好设计为not null, 或者用一个值代替null
    h.联合索引将区别度大的字段放前面,可以提高检索效率

  • 非聚簇索引一定要回表吗
    当辅助索引包换了所有select 后面的字段值时不需要回表,包括唯一,普通,联合索引的情况

  • 什么是事务
    事务是逻辑上的一组不可分割数据库操作,要么执行,要么不执行。执行结果使数据库状态转为另外一种状态

  • 事务的四大特性
    a.原子性(一组不可分割的一系列操作)
    b.一致性(一组操作,不会出现中间状态结果,数据是完整的,强调完整性)
    c.隔离性 (一组操作在全部执行后才对其他事务可见,强调隔离不相互影响)
    d.持久性(一组操作完成提交后,是持久不可变的,即使数据库故障)

  • 什么是脏读,不可重复读,幻读
    脏读:一个事务执行了一部分操作,但是回滚了,而另外一个事务读到了中间状态
    不可重复读: 一个事务两次读取一条记录的结果不一样,比如在两次读之间进行了更新,强调更新
    幻读:一个事务两次读取数据,发现两次结果集不一样,比如在两次读取中进行插入一些记录,强调新增

  • 事务隔离级别
    READ-UNCOMMITTED:读未提交,会引发脏读,不可重复读,幻读
    READ-COMMITTED: 读取已提交,可以解决脏读问题,还是存在不可重复读,幻读问题
    REPEATABLE-READ:可重复读,可以解决脏读,不可重复读问题,还是存在幻读问题
    SERIALIZABLE:串行,可以解决脏读,不可重复读,幻读问题,所有事物串行化,效率很低
    (mysql默认采用REPEATABLE-READ,而oracle默认采用READ-COMMITTED,隔离级别是基于锁实现的,隔离级别越低锁越少,理论上REPEATABLE-READ并发效果没READ-COMMITTED好,但是mysql使用mvvc来实现的,所有并不会对mysql的性能带来什么影响)

猜你喜欢

转载自blog.csdn.net/weixin_38312719/article/details/105610519
今日推荐