mysql之数据库特性认识

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

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、分库分表(分布式数据库中间件)

posted @ 2016-08-27 20:03  googlemeoften  阅读(3472)  评论(0编辑  收藏  举报