MYSQL面试常考的知识点总结

2019-07-15 20:56:11  阅读 174 次 评论 0 条
     第一范式1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
     第二范式2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;  

     第三范式3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。



     关键字:selectfromjoinonwheregroup byhavingorder bydistinct

     执行顺序 from > join > on > where > group by > having > select > distinct > order by



     UNION/ALL:组合多个结果表,并消去表中重复行,和ALL一起使用时,不消除重复行。

     EXCEPT/ALL:在table1中但不在table2中的行并消除重复行,和ALL一起使用时,不消除重复行。

     INTERSECT/ALL:包括table1和table2中都有的行并消除重复行,和ALL一起使用时,不消除重复行。



     内连接:结果仅包含符合连接条件的两表中的行

     外连接:结果包含符合条件的行,同时包含不符合条件的行(分为左外连接、右外连接和全外连接)
     左外连接:左表全部行+右表匹配的行,如果左表中某行在右表中没有匹配的行,则显示NULL。
     右外连接:右表全部行+左表匹配的行。
     全外连接:全外连接:不管匹配不匹配,全部显示出来。

     交叉连接:返回左表中所有行与右表中所有行的组合,也称笛卡尔积。



     CHAR:指定长度,如果一个数据实际长度比设定长度短,那么它将按照设定(最长)长度储存,不足部分,填补空格。适用于固定长度的字段,如性别、手机号等。

     VARCHAE:指定最大长度,但该长度可变,即如果数据的实际长度比设定长度短,那么它将按照实际长度储存,而不占用剩余的空间。 适用于非固定长度的字段,如姓名、城市名等。



     DROP直接删掉表 。 

     TRUNCATE删除表中数据,再插入时自增长id又从1开始 。 

     DELETE删除表中数据,可以加WHERE字句。



     原子性Atomicity)一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作。

     一致性Consistency)数据库总是从一个一致性的状态转换到另一个一致性的状态。
     隔离性Isolation)一个事务所做的修改在最终提交以前,对其他事务是不可见的。

     持久性Durability)一旦事务提交,则其所做的修改会永久保存到数据库。



   悲观锁:对数据被外界修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。(悲观锁的实现,往往依靠数据库提供的锁机制)
   乐观锁:大多是基于数据版本 ( Version )记录机制实现。

 即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来 实现。 读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提 交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据 版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据



     脏读:一个事务读取到了另外一个事务没有提交的数据;(修改的数据还未提交就被另一个事务使用这个数据)

     不可重复读:在同一事务中,两次读取同一数据,得到内容不同;(两次读取同一数据之间,另一个事务对数据进行了修改)

     虚读:同一事务中,用同样的操作读取两次,得到的记录数不相同;(两次相同的操作之间,另一个事务对数据进行了新增或删除)



     序列化 (Serializable):可避免脏读、不可重复读、幻读的发生。

     可重复读 (Repeatable read):可避免脏读、不可重复读的发生。
     读已提交(Read committed):可避免脏读的发生。

     读未提交 (Read uncommitted):最低级别,任何情况都无法保证。



MVCC最大的好处:读不加锁,读写不冲突。

     1.多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。 这样在读操作不用阻塞写操作,写操作不用阻塞读操作的同时,避免了脏读和不可重复读

     2.当MVCC数据库更新一条数据时,不会直接重写原始的数据,而是修改新创建的数据副本。因此会有多个版本的数据被保存下来。每个事务看到的数据版本依赖于隔离级别的实现。MVCC里最通用的隔离级别的实现就是快照隔离。在快照隔离的情况下,事务只会获取到数据的在事务开始前的状态。




MyISAM
InnoDB
事物支持不支持
支持
锁的粒度
表锁行锁
存储容量
无上限64TB
哈希索引不支持
支持
全文索引
支持
以前不支持,现在支持
外      键不支持支持
     InnoDB是非事务的存储引擎;适合用于频繁查询的应用;表锁,不会出现死锁;适合小数据,小并发
     InnoDB是支持事务的存储引擎;合于插入和更新操作比较多的应用;设计合理的话是行锁(最大区别就在锁的级别上);适合大数据,大并发。

     MyISAM表的数据文件和索引文件是自动分开的;InnoDB的数据和索引是存储在同一个表空间里面,但可以有多个文件组成。



     1.InnoDB要缓存数据块,而MyISAM只缓存索引块
     2.InnoDB寻址要映射到块,再到行,MyISAM记录的直接是文件的OFFSET,定位比InnoDB要快

     3.InnoDB还需要维护MVCC一致



    XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式。
        防止方法:做数据校验、做标签转换,如:空格 转化为  。
     SQL注入攻击是注入攻击最常见的形式,当服务器使用请求参数构造SQL语句时,恶意的SQL被嵌入到SQL中交给数据库执行;
        防止方法:输入校验、sql不要动态拼接,用参数化的sql。
     CSRF攻击(Cross Site Request Forgery,跨站请求伪造)是攻击者通过跨站请求,以合法的用户身份进行非法操作(如转账或发帖等)。
     CSRF的原理是利用浏览器的Cookie或服务器的Session,盗取用户身份;

        防止方法:使用post代替get,因为post不会被缓存;每次清除掉cookie。



    由于内容所占篇幅较大,具体内容请移至另一篇《MYSQL主从复制


本文地址:https://www.yangguangdream.com/?id=2039
版权声明:本文为原创文章,版权归 编辑君 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?