最近面试经常被面试官问道关于数据库方面的知识,于是总结一下面试官问的题以及自己对数据库的认识

1、之前百度面试官问了我一个特别基础的sql问题:如何清除表的所有记录,以前在学校做项目开发的时候有使用过,但是面试的时候一下没有想到,下来才想到该怎么写sql,我都不得不吐槽一下自己

  这个问题的sql有两种写法:1、truncate table tablename        truncate table命令将快速删除数据表中的所有记录,但保留数据表结构,数据不可恢复(自增主键从头开始)

               2、delete from tablename where 1=1 获得delete from tablename 该删除操作记录在系统回滚段中,数据可恢复

 

2、数据库的索引:主要是InnoDB和MYISAM索引,他们的区别主要体现在文件结构,锁,以及操作方面

  1、文件结构:InnoDB是索引文件和数据文件分离,MYIASAM所以和数据文件在同一个文件中

  2、锁:InnoDB采用的是行锁,实现了分段锁,就行并发写的时候,每个事务只对相应的行进行加锁,MYISAM采用的是表锁,因此会并发写的时候就会有瓶颈

  3、操作方面:InnoDB支持事务,MUISAM不支持事务,但是count(*)使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器

 

3、事务的特性:

  1、原子性:事务要么成功,要么失败,mysql实现事务的原子性和undo.log日志有关系

  2、一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态;比如银行转账的问题;两个账号version0(A=100,B=0);A给B转账100会经历如下步骤:1、读取A的金额,查看是否有100元,

    如果有就对A-100,此时就会有一个中间态,定义为version1(A=0,B=0),2、B+100,数据库状态变成了version2(A=0,B=100);数据库的一致性要求用户看到的数据要么在version0的状态,要么在version2的状态,不能让用户看到version1这个中间态,数据库的一致性与原子性是密切相关的

  3、隔离性:我个人的理解:隔离性是在权衡数据一致性以及性能所做出的一个折衷方案,主要有四种隔离级别:(下面我通过A、B两个事务来进行讲解)

    1、Serializable:该隔离级别是使用了悲观锁---排它锁,通过读写锁分离实现强一种性,虽然数据实现了强一致性,但是并行度不高

    2、读未提交:假设有A、B两个事务,A事务修改了数据data,在B事务中就能够马上看到数据的修改,这感觉想JAVA里面的volatile变量一样

    3、读已提交:假设有A、B两个事务,A事务修改了数据data,并且提交了该事务,B事务就能够读到修改的数据,这是oracle的默认隔离级别。该级别存在不可重复读的问题(ORCAL默认隔离级别)

    4、可重复的:假设有A、B两个事务,A事务修改了数据data,并且提交了该事务,B事务看不到刚才修改的数据,在该事务中多次执行select读出的数据是一致的(Mysql默认隔离级别)

    5、上面的的隔离级别是SQL92中定义的,MVCC可以看作是对该标准的一种扩展;MVCC是一种乐观锁,让数据多版本化,同时为每个事务一个事务ID来实现数据的一致性,这是一种通过空间换时间的策略

 

4、索引:关于索引的知识主要有:索引的数据结构,索引的使用以及优化

  1、不管是InnoDB还是MYISAM索引引擎都是采用的B-Tree的变形---B+Tree:B-Tree和B+Tree的区别:B-Tree的节点上存储了数据,而B+Tree的只有在叶子节点上才存储数据。在Mysql中,定义每个节点是页(页是计算机管理存储器的逻辑块)的整数倍,这样就可以使用操作系统的局部预读的特性,减少磁盘的I/O次数。

  2、建立索引的时候需要考虑到如下几方面的问题:

    1、我们写的sql的where条件中是否会经常用到该列,如果经常用到才考虑建索引(只是考虑,还要主要下面的问题)

    2、最左前缀原理:mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式

    3、索引选择性与前缀索引:索引文件本身要消耗存储空间,同时索引会加重插入、删除和修改记录时的负担,另外,MySQL在运行时也要消耗资源维护索引,因此索引并不是越多越好;对某列建立索引要考虑到该列数据的选择性,同时有一种与索引选择性有关的索引优化策略叫做前缀索引,就是用列的前缀代替整个列作为索引key,当前缀长度合适时,可以做到既使得前缀索引的选择性接近全列索引,同时因为索引key变短而减少了索引文件的大小和维护开销

    4、Explain的使用及优化(rows是核心指标)

      1、注意Extra列:如果是useing filesort 或者
      2、看有没有使用到预期的索引,扫描的rows是不是很多,如果是很多,说明索引不好,我们可能要修改索引

5、简单的sql优化

  1、选择正确的存储引擎

  2、建立索引,索引的建立参考上面

  3、避免使用select*,只查我们需要的数据,减少网络数据的传输

  4、为每张表设计一个自增ID,插入数据会涉及到索引的更新以及B+Tree的分裂,降低性能

  5、尽量使用NOT NULL,NULL需要额外的空间,并且,在你进行比较的时候,你的程序会更复杂

  6、拆分大的DELETE和INSERT/避免大事务

  7、每个字段尽量小,对于大多数的数据库引擎来说,硬盘操作可能是最重大的瓶颈。所以,把你的数据变得紧凑可以减少磁盘访问(比如年龄)

  8、分库分表(分布式数据库中间件)

mysql之数据库特性认识的更多相关文章

  1. WAF Bypass数据库特性(Mysql探索篇)

    0x01 背景 Mysql数据库特性探索,探索能够绕过WAF的数据库特性. 0x02 测试 常见有5个位置即:   SELECT * FROM admin WHERE username = 1[位置一 ...

  2. MySQL的数据库引擎的类型及区别

    MySQL的数据库引擎的类型 你能用的数据库引擎取决于mysql在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和 ...

  3. MySQL对数据库数据进行复制的基本过程详解

    MySQL对数据库数据进行复制的基本过程详解 这篇文章主要介绍了MySQL对数据库数据进行复制的基本过程,解读了Slave的一些相关配置,需要的朋友可以参考下 复制 复制是从一个MySQL服务器(ma ...

  4. MySQL/MariaDB数据库的Galera高可用性集群实战

      MySQL/MariaDB数据库的Galera高可用性集群实战 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Galera Cluster概述 1>.什么是Gale ...

  5. MySQL/MariaDB数据库的各种日志管理

    MySQL/MariaDB数据库的各种日志管理 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.事务日志 (transaction log) 1>.Innodb事务日志相 ...

  6. MySQL/MariaDB数据库的事务和隔离级别

      MySQL/MariaDB数据库的事务和隔离级别 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.事务概述 1>.事务Transactions 一组原子性的SQL语句 ...

  7. MySQL/MariaDB数据库的索引工作原理和优化

    MySQL/MariaDB数据库的索引工作原理和优化 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际工作中索引这个技术是影响服务器性能一个非常重要的指标,因此我们得花时间去了 ...

  8. MySQL/MariaDB数据库的存储引擎

    MySQL/MariaDB数据库的存储引擎 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.MySQL体系结构 连接管理模块: 负责接收远程用户的连接. 线程管理模块: 维护 ...

  9. MySQL 按照数据库表字段动态排序 查询列表信息

    MySQL 按照数据库表字段动态排序 查询列表信息 背景描述 项目中数据列表分页展示的时候,前端使用的Table组件,每列自带对当前页的数据进行升序或者降序的排序. 但是客户期望:随机点击某一列的时候 ...

随机推荐

  1. c++ string.find()函数的陷阱

    string.find(char *)查找字符串中是否包含子串 找到:返回第一个索引 没有找到:返回一个很大的随机数字而不是返回负数(这是个坑) 所以不能这么写if (string.find(str) ...

  2. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

  3. 依赖注入及AOP简述(十三)——AOP应用举例(完结) .

    2.     AOP应用举例 在一般的应用程序开发中,有一些典型的AOP应用,使得开发者可以专注于业务逻辑本身,而不是与之完全无关的一些“方面”. l        首先就是关于前面介绍过的日志输出类 ...

  4. Sass介绍及入门教程

    Sass是什么? Sass是"Syntactically Awesome StyleSheets"的简称.那么他是什么?其实没有必要太过于纠结,只要知道他是“CSS预处理器”中的一 ...

  5. [转载]解析WINDOWS中的DLL文件---经典DLL解读

    [转载]解析WINDOWS中的DLL文件---经典DLL解读 在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库.现在就走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧! ...

  6. css笔记:如何让一个div居于页面正中间

    如何让一个div居于页面中间,我今天说的是让一个div水平居中同时垂直居中,而不是简单的top:50%,left:50%.当然,我们就按一开始的思路写一下:top,left属性都设为50%,看一下效果 ...

  7. Nicholas C. Zakas如何面试前端工程师

    转载自:http://www.cnblogs.com/yizuierguo/archive/2010/02/04/1663767.html Original Post:Interviewing the ...

  8. BZOJ 2726: [SDOI2012]任务安排( dp + cdq分治 )

    考虑每批任务对后面任务都有贡献, dp(i) = min( dp(j) + F(i) * (T(i) - T(j) + S) ) (i < j <= N)  F, T均为后缀和. 与j有关 ...

  9. Python进阶之函数式编程(把函数作为参数)

    什么是函数式编程? 什么是函数式编程? 函数:function 函数式:functional,一种编程范式 函数式编程是一种抽象计算的编程模式 函数≠函数式,比如:计算≠计算机 在计算机当中,计算机硬 ...

  10. Android Shape画圆,矩形

    画圆环代码如下: 画圆环,外边的边界宽度大一点即可: <?xml version="1.0" encoding="utf-8"?> <shap ...