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

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. update慢怎样处理?

    update慢: 1.表的pctfree參数设置? 2.运行计划用索引还是全表扫? 3.SQL语句写法问题? 4.update慢还是commit慢? 5.更新多少条数据? 6.表是否频繁update造 ...

  2. .NET面试题解答

    抽象类和接口有什么区别?使用时候有什么需要注意的吗?答:相同点:都不能被直接实例化,都通过继承实现其抽象方法: 不同点: 1) 接口支持多继承:抽象类不能实现多继承: 2) 接口只能定义行为:抽象类既 ...

  3. Java RMI 学习笔记

    概况 功能:提供了客户辅助对象和服务辅助对象,为客户辅助对象创建和服务辅助对象形同的方法. 优点:客户不必写任何网络或I/O代码,调用远程方法就和运行在客户自己的本地JVM上对对象进行的正常方法一样. ...

  4. Linux下终端利器tmux(转)

    “君子生非异也,善假于物也” .–语出<荀子·劝学> 如果记得没错的话,<荀子·劝学>我们这一代高中的时候应该都读过这篇文章.原意大概是君子的资质与一般人没有什么区别,君子之所 ...

  5. 关于智能指针auto_ptr

    智能指针auto_ptr和shared_ptr也是面试中经常被问到的一个 感觉看auto_ptr的源码反而更加容易理解一些,因为源码的代码量并不大,而且比较容易理解. 本篇主要介绍auto_ptr 其 ...

  6. mfc分个窗口,设置分割条不可移动

    最近要做一个项目,做界面时遇到了这个问题,找了好多资料,终于解决了,在此记录一下,希望对有需要的人有所帮助.好了,不多说了,具体的处理如下: 新建一个类CFixSplitterWnd继承CSplitt ...

  7. Linux学习之(())操作符

    在刚开始学习inux shell脚本编程时候,对于它的 四则运算以及逻辑运算.估计很多朋友都感觉比较难以接受.特变逻辑运算符”[]”使用时候,必须保证运算符与算数 之间有空格. 四则运算也只能借助:l ...

  8. 有关MyISAM引擎的锁定机制

    本文介绍下,mysql数据库中MyISAM引擎的锁定机制的相关知识,感兴趣的朋友可以参考下. 本节内容: MyISAM引擎的锁定机制 在mysql数据库中,MyISAM存储引擎适合于读频率远大于写频率 ...

  9. CodeForces 379 D. New Year Letter

    枚举开头结尾的字母,枚举ac的个数,总AC个数就是两个Fibonacci数列的和..... D. New Year Letter time limit per test 1 second memory ...

  10. HTML5 canvas入门

    HTML5 Canvas入门 <canvas> 标签定义图形,比如图表和其他图像,您必须使用脚本来绘制图形.在画布上(Canvas)画一个红色矩形,渐变矩形,彩色矩形,和一些彩色的文字. ...