zoukankan      html  css  js  c++  java
  • MySQL

    索引-链接

    索引链接2

    1.Heap表是什么?

       Heap表存放在内存中,用于临时高速存储。不允许BLOB和TEXT字段。只允许比较运算符。不支持AUTO_INCREMENT。索引不能为NULL。

    2.与Oracle相比,MySQL有什么优点?

      开源免费、便携式、带有命令提示符的GUI、使用MySQL查询浏览器支持管理

    3.如何区分FLOAT 和 DOUBLE?

      浮点数以 8 位精度存储在 FLOAT 中,有四个字节。浮点数以 18 位精度存储在 DOUBLE 中,有八个字节。

    4.如何区分 CHAR_LENGTH 和 LENGTH?

      CHAR_LENGTH 是字符数,而 LENGTH 是字节数。Latin 字符的这两个数据是相同的,但是对
    于 Unicode 和其他编码,它们是不同的。
     
    5.MySQL中ENUM中用法?
      ENUM 是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用。
      Create table size(name ENUM('Smail,'Medium','Large');
     
    6.CHAR 和 VARCHAR 的区别?
      CHAR 和 VARCHAR 类型在存储检索方面有所不同。
      CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 到 255。varchar存储变长数据。当 CHAR 值被存储时,它们被用空格填充到特定长度,检索 CHAR 值时需删除尾随空格。char数据检索数据高于varchar。
     
    7.MySQL字符串类型有哪些?
      char、varchar、text、blob、tinyblob、tinytest、longblob、longtest
     
    8. MySQL中有几种锁?
    ① 行锁:某一行加上锁,也就是一条记录加上锁。
    ② 表锁:某个表加上锁。
    ③ 乐观锁:乐观锁不是数据库自带的,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新,再去判断是否有冲突了。
    ④ 悲观锁:与乐观锁相对应的就是悲观锁了。悲观锁就是在操作数据时,认为此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作,这点跟java中的synchronized很相似,所以悲观锁需要耗费较多的时间。另外与乐观锁相对应的,悲观锁是由数据库自己实现了的,要用的时候,我们直接调用数据库的相关语句就可以了。
      共享锁和排它锁是悲观锁的不同的实现,它俩都属于悲观锁的范畴。
    ⑤ 共享锁S:读锁,一个事务对对象A加上S锁,那么对A可以读取,不可更新。加锁期间其他事物对A只能加S锁,不能加X锁。
    ⑥ 排他锁X:写锁,一个事务对对象A加上X锁,那么对A可以读取且更新。加锁期间其他事务不能对A加任何锁。
    ⑦ 意向锁lX/lS:属于表锁,且取得意向共享锁/意向排他锁是取得共享锁排他锁的前提条件。
      一级封锁协议:事务T修改数据时必须添加X锁,直到结束才释放锁。可解决丢失修改问题。
      二级封锁协议:在一级基础上,要求读取数据时必须加S锁,读取完立即释放S锁。解决脏读问题。
      三级封锁协议:在二级基础上,要求读取数据时必须加S锁,直到事务完成后才释放S锁,解决不可重复读问题。
    9. MVCC?
      多版本并发控制是MySQL的InnoDB存储引擎实现隔离级别的一种具体方式,用于实现提交读可重复读两种隔离级别。
      在实际场景中,读操作往往多于写操作,但是一行记录事先上了写锁,那么就不允许其他事务进行读,因此引入了MVVC。基本思想是写操作更新最新的版本快照,读操作去读旧版本快照,没有互斥关系。维护了一个系统版本号SYS_ID:是一个递增数字,每开启一个事物便加一,还有一个事务版本号TRX_ID:事务开始时的系统版本号。MVCC还维护了一个ReadView结构,包含了当前系统未提交的事务列表,还有该列表的最小值最大值。
      在进行 SELECT 操作时,根据数据行快照的 TRX_ID 与 TRX_ID_MIN 和 TRX_ID_MAX 之间的关系,从而判断数据行快照是否可以使用:
    • TRX_ID < TRX_ID_MIN,表示该数据行快照时在当前所有未提交事务之前进行更改的,因此可以使用。

    • TRX_ID > TRX_ID_MAX,表示该数据行快照是在事务启动之后被更改的,因此不可使用。

    • TRX_ID_MIN <= TRX_ID <= TRX_ID_MAX,需要根据隔离级别再进行判断:

      • 提交读:如果 TRX_ID 在 TRX_IDs 列表中,表示该数据行快照对应的事务还未提交,则该快照不可使用。否则表示已经提交,可以使用。
      • 可重复读:都不可以使用。因为如果可以使用的话,那么其它事务也可以读到这个数据行快照并进行修改,那么当前事务再去读这个数据行得到的值就会发生改变,也就是出现了不可重复读问题。
    10. Next-Key-Locks?

      InnoDB有三种行锁的算法:

      Record Lock:单个行记录上的锁。

      Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止同一事务的两次当前读,出现幻读的情况。

      Next-Key Lock:1+2,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题。
     
    11. 并发一致性问题?
      丢失修改:两个事务对同一数据进行修改,T1先进行修改,T2后进行修改,覆盖了T1的修改。
      不可重复读:两次读取的数据不相同,可能是其他事务在两次读取期间对数据进行了修改。
      脏读:T1修改数据,T2读取,T1撤销修改,那么T2读取的就是脏数据。
      幻读:T1读取某个范围内的数据,T2插入数据,T1再次读取的结果和第一次不同。
     
    12. 事务四特性?
      A原子性:事务视为不可分割的最小单元。
      C一致性:所有事物对同一数据的读取结果都是相同的。
      I 隔离性:一个事物在最终提交前对其他事务不可见。
      D持久性:一个事务一旦提交,则其对数据的修改会永久保存在数据库中。
     
    13. MySQL事务隔离级别?
      未提交读:可以读取未提交事务中的数据。                         //
         提交读:只能读取已提交事务中的数据。                            //解决 脏读
      可重复读:多次读取同一事物的结果是相同的。                  //解决 脏读 不可重复读
      串行事务:强制事务串行执行,多个事物之间相互不干扰。//解决 脏读 不可重复读 幻读
     
    14. 主从复制?读写分离?
      多个服务器,设置一个主服务器负责写操作,多个从服务器负责读操作,极大程度减缓了锁的征用。binlog线程负责将主服务器上的数据更改写入二进制日志(Binary log)中。I/O 线程 负责从主服务器上读取二进制日志,并写入从服务器中继日志(Relay log)。SQL 线程 负责读取中继日志,解析出主服务器已经执行的数据更改并在从服务器中重放(Replay)。从而维护数据一致性。读写分离常用代理方式来实现,代理服务器接收应用层传来的读写请求,然后决定转发到哪个服务器。
     
    15. MySQL索引?
      B+树索引:InnoDB的B+树索引可以分为聚簇索引(主索引)和非聚簇索引(辅助索引),聚簇索引是叶子节点的data域存放着完整数据,将主索引和数据放在一起。非聚簇索引的叶子节点data域记录着主键的值,因此使用辅助索引进行查找时,先找到主索引,再根据主索引查找到数据。
      哈希索引:以O(1)时间进行查找,但是失去了有序性,因此无法用于排序和分组且只能用于精确查找,无法用于范围查找或部分查询。InnoDB有一个自适应哈希索引,当某个索引值被查找的十分频繁时,会在B+树索引值上再创建一个哈希索引,这样就让B+树具有哈希索引的一些优点,例如快速查找。
      全文索引:用于查找文本中的关键词,而不是直接比较是否相等。
      空间数据索引:用于地理数据存储。
     
    16. MySQL优化?
      索引优化:
        独立的列:在进行查询时,索引列不能是表达式的一部分,也不能是函数的参数,否则无法使用索引。
        多列索引:在进行查询时,索引列不能是表达式的一部分,也不能是函数的参数,否则无法使用索引。
        索引列的顺序:让选择性最强的索引列放在前面。
      查询性能优化:
        使用Explain进行分析
        优化数据访问:减少请求的数据量,减少服务器端扫描的行数
        重构查询方式:切分大查询,分解大连接查询
     
    17. MySQL存储引擎?
      InnoDB:是 MySQL 默认的事务型存储引擎。实现了四个标准的隔离级别,默认级别是可重复读,在可重复读隔离级别下,通过多版本并发控制(MVCC)+ Next-Key Locking 防止幻影读。主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对查询性能有很大的提升。支持行锁和表锁,支持外键约束,支持在线热备份。适合于对事务要求改=高,高并发场景。
      MylSAM:不支持事务,不支持行锁,存储速度快,适合于对事物没要求且以select、insert为主的应用场景。
      Memory:是用保存在内存中的数据来创建表,每个memory表对应一个磁盘文件。格式是.frm。由于他的数据是存放在内存中的,并且默认使用HASH索引,所以它的访问速度特别快,同时也造成了他的缺点,就是数据库服务一旦关闭,数据就会丢失,另外对表的大小有限制
      MERGE:一组MyISAM表的组合,这些MyISAM表结构必须完全相同。对MERGE表的操作实际上是对其子表进行的。
     
     
    19. 三范式
      第一范式:表的列的具有原子性,不可再分解
      第二范式:要求数据库表中的每个实例或记录必须可以被唯一地区分。符合所有字段要和主键有直接的依赖关系。
      第三范式:要求一个数据库表中不包含已在其它表中已包含的非主键字段
     
     
     
     
     
     
     
     
     
     

    i

  • 相关阅读:
    201871010106丁宣元 《面向对象程序设计(java)》第八周学习总结
    201871010106丁宣元 《面向对象程序设计(java)》第十一周学习总结
    201871010106丁宣元 《面向对象程序设计(java)》第十周学习总结
    学习:数据结构树状数组
    学习:数据结构线段树
    学习:数据结构哈希
    学习:数据结构单调栈
    学习:数学欧拉定理与扩展欧拉定理
    CRUD全栈式编程架构之导入导出的设计
    CRUD全栈式编程架构之服务层的设计
  • 原文地址:https://www.cnblogs.com/qmillet/p/12344470.html
Copyright © 2011-2022 走看看