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

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. python-多线程(原理篇)

    多线程的基本概念 语言学习总是绕不过一些东西,例如多进程和多线程,最近越来越发现,上来看几个实例练习一下过几天就不知其所以然了.所以还是先看看原理,在看实例练习吧! 线程的概念 概念:线程是进程中执行 ...

  2. Android-Tab单选控件

    今天看到项目中有一个控件写得很美丽,据说是github上开源的控件,地址没找到,例如以下图所看到的,很常见的效果,几个tab页面来回切换: 转载请标明出处:http://blog.csdn.net/g ...

  3. java对象的内存布局(二):利用sun.misc.Unsafe获取类字段的偏移地址和读取字段的值

    在上一篇文章中.我们列出了计算java对象大小的几个结论以及jol工具的使用,jol工具的源代码有兴趣的能够去看下.如今我们利用JDK中的sun.misc.Unsafe来计算下字段的偏移地址,一则验证 ...

  4. NPOI.dll 用法。单元格,样式,字体,颜色,行高,宽度。读写excel

    NPOI.dll 用法.单元格,样式,字体,颜色,行高,宽度.读写excel 转载:http://yuncode.net/code/c_531e679b3896495 view source prin ...

  5. Windows消息传递函数SendMessage参数属性

    Windows消息传递函数SendMessage参数属性 转载于:http://www.cr173.com/html/5605_1.html Windows是一个消息驱动式系统,SendMessage ...

  6. 创建基于maven的项目模版

    我们在实际工作中 ,有些项目的架构是相似的,例如基于 restful的接口项目,如果每次都重新搭建一套架构或者通过拷贝建立一个项目难免有些得不偿失,这里我们可以用maven的archtype建立项目模 ...

  7. JAVA 年老代收集器 第10节

    JAVA 年老代收集器 第10节 上一章我们讲了新生代的收集器,那么这一章我们要讲的就是关于老年代的一些收集器.老年代的存活的一般是大对象以及生命很顽强的对象,因此新生代的复制算法很明显不能适应该区域 ...

  8. 最近做OpenWrt的总结

    用到了哪些东西 需要在OpenWrt上开发一个客户端,用C语言写还比较方便,最开始在linux上跑,后面移植到路由器上,做成ipk.除了稍微修改了下Makefile,其他的什么都没改. 因为需要做个配 ...

  9. C++ ASCII 码的一些问题

    关于ASCII码和转义字符的对应问题,一直都有个困惑.所以今天校验了一下是什么情况. 转义字符的百度百科:http://baike.baidu.com/link?url=D9ytjAeiYr1ZGKG ...

  10. beego任务定时执行,延迟执行

    import ( "github.com/astaxie/beego" "github.com/astaxie/beego/toolbox") cronExpr ...