• 数据库答题


    数据库原理:就是将所要保存的数据,写入文本文件。这个文本文件就是你的数据库。这些文件以mysql的innodb来说是以b+数的方式存储的数据集合。也就是:保存有组织数据的容器

    索引原理:引(Index)是帮助MySQL高效获取数据的数据结构。MySQL的索引数据结构就是b+树,

        对比平衡二叉树:数据文件是存在硬盘文件中的,使用的时候需要加载进内存里面,当数据量太大的时候,不可能把全部数据都加载在内存,所有每次只能比较相邻节点的话,如果元素数量非常多的话,这样导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下

        树的好处和b-树的对比:

          1, B树与红黑树最大的不同在于,B树的结点可以有许多关键字,这样可以降低树的高度,减少io操作

          2,由于B+树的内部节点只存放主键因此,这样一个页中,存储的索引就会比较多,一次读取,可以在内存页中获取更多的主键,相对来说IO读写次数也就降低了

          3,B+树的叶节点由一条链相连,因此,当需要进行一次数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点,然后通过链进行O(N)的顺序遍历即可。limit操作

          4,非叶子节点不放数据,每个关键字都要走一次根到子节点的路径,查询效率会比较稳定

        底层:用16kb的页来存储数据,页头两端都有指针,形成一个双向链表的页的链表,每一个页可以存4种记录,主索引树非叶节点,主索引树叶子节点,辅助索引树叶子节点,辅助索引树非叶节点。主索引树非叶节点主要有, 节点存储的索引值,

        索引值对应的页的编号,作用是定位那条记录,找到对应的页后,对于页内的数据都是按照主键采用递增的排序,通常使用二分查找法每次把查找空间缩小一半。

        对比辅助索引:基本和主键索引一场,辅助索引树非叶节点的值存储的是主键值,用来在主索引树里再做一次B+树检索来找到整条记录。

                           

    索引具体使用:

      UNIQUE唯一索引:不可以出现相同的值,可以有NULL值

      INDEX普通索引:允许出现相同的索引内容

      PRIMARY KEY主键索引:不允许出现相同的值,且不能为NULL值,一个表只能有一个primary_key索引

    建立索引的必要:

      1,索引的选择性较低。是指不重复的索引值在表中很少一部分的时候,比如性别,地区,这些可选值范围很小的时候不需要加

      2,对 where,on,group by,order by 中出现的列使用索引,MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。

      3,对较小的数据列使用索引,这样会使索引文件更小,同时内存中也可以装载更多的索引键

      4,为较长的字符串使用前缀索引

        如果索引列长度过长,这种列索引时将会产生很大的索引文件,不便于操作,可以使用前缀索引方式进行索引前缀索引应该控制在一个合适的点,比如每个长度为10单词作为索引,但实际上可能前3个或者4个已经可以判断出,所以只需要在前缀字段添加索引,减少                   索引的大小,一次能在加载更多的索引在内存里面。

      5,使用组合索引,可以减少文件索引大小,在使用时速度要优于多个单列索引 

        联合索引,a,b,c相当于创建了a,b,c      a,b    a三个索引,mysql 组合索引"最左前缀"的原则。联合索引a,b,c从左到右进行索引,如果没有左前索引Mysql不执行索引查询

      不使用索引的情况:1,因为所有索引列参与了计算,2LIKE "%后盾%" -- like前面字符串是通配符的情况不走索引,3,字符串与数字比较不使用索引;用union和in替换or

    事务的ACID

      1、原子性(Atomicity):整个数据库事务是不可分割的工作单位。一个事物内所有操作共同组成一个原子包,要么全部成功,要么全部失败。

       2、一致性(Consistency):所谓的一致性是基于原子性。原子性只保证了一个事物内的所有操作同一性,不会出现你完成,我还未完成。但是,原子性并没有保证大家同一时刻一起完成,计算机指令是有先后顺序的,这样就决定了一个事物的提交,会经历一个时间过程,那么如果事物提交进行到了一半,读取了数据库,会不会读到中间结果?为了防止这样的情况,数据库事物的一致性就规了事物提交前后,永远只可能存在事物提交前的状态和事物提交后的状态,从一个一致性的状态到另一个一致性状态,而不可能出现中间的过程态。

       3、隔离性(Isolation):事务的隔离性,基于原子性和一致性,每个事务互不干扰。这样每个事务都感觉不到有其他事务在并发地执行。

       4、持久性(Durability):当一个事物提交之后,数据库状态永远的发生了改变,这个事物只要提交了,哪怕提交后宕机,他也确确实实的提交了。

    事务的并发问题

      1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

      2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

        针对当前读,RR隔离级别保证对读取到的记录加锁 (记录锁),同时保证对读取的范围加锁,新的满足查询条件的记录不能够插入 (间隙锁),不存在幻读现象。

      3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

      小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

    MySQL事务隔离级别

    事务隔离级别 脏读 不可重复读 幻读
    读未提交(read-uncommitted)
    不可重复读(read-committed)
    可重复读(repeatable-read)
    串行化(serializable)

    并发下的索引加锁:

      mvcc(Multiversion Concurrency Control),即多版本并发控制技术,快照读,当前读:读不加锁,读写不冲突。读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)。快照读,读取的是记录的可见版本 (有可能是历史版本),不用加锁。当前读,读取的是记录的最新版本,并且,当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录。

      快照读:简单的select操作,不会对数据库加锁,如果其他事务正进行的delete,update操作,这时的快照读也不等待锁的释放,再read commited事务隔离级别中,会读取被锁前最新的版本的数据,再repeated read事务隔离级别中,会读取事务开始时版本的数据

      当前读:select ....lock in share mode加s锁,select ....for update加x锁

      锁的算法:innodb主要使用行锁和间隙锁,在查询的字段有使用主键索引和唯一索引的时候,如果使用等值条件,a=1,由于他的唯一性,不可能再添加同样的数据,基本只使用行锁,在索引是非唯一索引的时候,或者是带有范围的时候(select * from table id < 6)小于6和6的区间被加了间隙锁和行锁,insert 小于6的操作会被阻塞,除了6以上

        详尽解释:http://hedengcheng.com/?p=771#_Toc374698316

      死锁:a,b事务并发情况下,a把id=1锁了,b把id=2锁了,b再去查找id=1,a再去查找id=2,两个事务互相等待,mysql抛出超时异常,b事务回滚,a事务得到资源

  • 相关阅读:
    证书格式转换
    emq知识点
    emq共享订阅
    SpringBoot
    Android网络编程Socket长连接
    Android 网络通信框架Volley简介(Google IO 2013)
    Android中的5种数据存储方式
    Android
    android解析XML总结(SAX、Pull、Dom三种方式)
    乔迁新禧
  • 原文地址:https://www.cnblogs.com/vhyc/p/9815453.html
Copyright © 2020-2023  润新知