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

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. 利用margin代替小图标的绝对定位;使代码更简洁

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. uva 10004 Bicoloring(dfs二分染色,和hdu 4751代码差不多)

    Description In the ``Four Color Map Theorem" was proven with the assistance of a computer. This ...

  3. 测试中的代码分享~将可以合并的方法去合并Func不赖

    在面向对象的设计中,我们经常会谈到“重构”,而重构之中有个叫合并方法的,就是将多个方法干的事类似,或者说,方法体的长向很像,那么,我们需要去考虑,将它们进行抽象! 原来的代码: /// <sum ...

  4. javaScript 工作必知(八) 属性的特性 值、写、枚举、可配置

    属性的特性 每个对象都拥有属性,属性具有哪些特性呢? 1.属性具有值.  2.属性是否是可写的.            3.是否是可枚举的.            4.是否是可配置的.   " ...

  5. U盘安装win7+CentOS7双系统

    决定要好好学习一下Linux了,不管是为了以后技术发展的需要抑或是满足自己的兴趣,都是时候来涉足一下了.我准备在我的ThinkPad X200i(一个老掉牙的老TP本子)上装一个Linux发行版,这里 ...

  6. leetcode LRU Cache python

    class Node(object): def __init__(self,k,x): self.key=k self.val=x self.prev=None self.next=None clas ...

  7. Android Studio常用小技巧

    1. Debug 模式查看变量的值: To quickly evaluate the value of any expression while debugging the program, hold ...

  8. node anyproxy ssi简易支持

    在项目中,ssi include是一个比较常用的功能,这样我们就可以通过web服务器的支持,将公用的html提取出来,改一个文件就会修改全部内容 但是这也带来了问题,在开发的时候没办法的刷新查看,需要 ...

  9. Linux中的那些英文缩写和她的含义们

    系统 man: Manual 意思是手册,可以用这个命令查询其他命令的用法. pwd:Print working directory 打印工作路径. su:Swith user 切换用户,切换到roo ...

  10. MarkWord

    MarkWord - 可发布博客的 Markdown编辑器 代码开源 1 /// <summary> 2 /// 同步呈现 3 /// </summary> 4 /// < ...