1.分别介绍一下innodb和myisam?
- MyIASM 是 MySQL 默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键, 因此当INSERT(插入)或 UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。ISAM 执行读取操作的速度很快,而且不占用大量的内存和存储资源。
- InnoDB 底层存储结构为 B+树, B 树的每个节点对应 innodb 的一个 page,page 大小是固定的, 一般设为 16k。其中非叶子节点只有键值,叶子节点包含完成数据。通常如果对数据进场进行增删改的时候推荐使用innodb。
2.innodb的数据结构
innodb的数据结构其实是b+树,主要跟b树的区别在于在叶子节点多了横向的指针,这样可以更加简单地去遍历数据。
3.Innodb和myisam的对比?
- innodb支持事务,myisam不支持事务。
- innodb支持外键,myisam不支持外键。
- myisam只支持表级锁,innodb他的锁粒度更加精细,支持行级锁,但是如果innodb在进行扫描时候不确定sql的范围,使用的也是表级锁。
- 执行大量的查询语句的时候myisam执行效率更好,执行大量的增加删除语句最好用innodb。
4.事务的概念?ACID的特征分别介绍一下?数据库的隔离级别?
-
事务(TRANSACTION)表示一个完整的不可分割的业务,批量的 DML 语句同时成功或者同时失败.原子性不可再分
最基本单元,可以看做一个完整的事件,通常一个事务可以对应一个完整的业务流程。
-
原子性(Atomicity) 整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)。
一致性(Consistency) 在事务开始之前与结束之后,数据库都保持一致状态。
隔离性(Isolation)一个事务不会影响其他事务的运行。
持久性(Durability) 在事务完成以后,该事务对数据库所作的更改将持久地保存在数据库之中,并不会被回滚。
-
读未提交(READ UMCOMMITTED)允许一个事务可以看到其他事务未提交的修改。
读已提交(READ COMMITTED)允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。他是sql Server,orical等数据库默认级别。
可重复读(REPEATABLE READ)确保如果在一个事务中执行两次相同的 SELECT 语句,都能得到相同的结果,不管其他事务是否提交这些修改。他是mysql默认的隔离级别。
串行化(SERIALIZABLE)该隔离级别为 InnoDB 的缺省设置。将一个事务与其他事务完全地隔离。
5.数据库的三大范式?
数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。
- 有主键,具有原子性,字段不可分割。就是所有字段值都是不可分解的原子值,比如说数据库我们经常用到地址这个字段就直接使用即可,但是如果需要用到省份、城市、我们就需要拆开,把省份、城市单独设为一列。
- 确保表中的每列都和主键相关,表中非主键列不存在对主键的部分依赖。要求每个表只描述一 件事情。比如说一个订单有多个商品,我们需要把订单表和商品表拆分,通过一个中间表来进行连接表示。
- 确保每列都和主键列直接相关,而不是间接相关。比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。
6.数据库怎么读写分离?怎么拆分表的?
- 首先主服务器的master数据库记录数据库的操作日志到binlog,然后从服务器开启io线程将同步binlog的操作日志记录到从服务器的relaylog里面(就是从服务器的缓存中),最后从服务器启动sql线程把relaylog里面的操作sql在从库进行执行,这样实现读写分离。
- 表的拆分有两种,垂直拆分和水平拆分
- 垂直拆分:垂直拆分是根据字段将表进行拆分(比如说订单表有价格和库存两个字段,把 库存单独存一个表,把库存单独存一个表拆分开来)
- 水平拆分:水平拆分就是按照表的字段的某些规则进行匹配拆分(比如说按照表的ID来进行拆分,id为1-1000的为一个表,1001-2000为第二个表这样拆分)
7.查询语句的优化?
- 避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等这样的操作符;
- 合理使用EXISTS,NOT EXISTS子句;
- 能够用BETWEEN的就不要用IN;
- 能够用DISTINCT的就不用GROUP BY;
- 程序中如果一次性对同一个表插入多条数据,把它拼成一条语句执行效率会更高;
8.索引是什么?
索引其实是对数据库的列的内容进行排序的结构,它有点像我们字典的定位页码的拼音或者笔画,可以帮助我们快速获取数据库的内容,是一种数据结构。
9.索引的优点和缺点?
-
优点:
大大加快数据的检索速度;
创建唯一性索引,保证数据库表中每一行数据的唯一性;
加速表和表之间的连接;
在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间;
-
缺点:
创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加;
索引需要占物理空间;
当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度;
10.索引在什么情况下使用?在什么情况下不使用?
-
使用情况:
主键列中创建索引;
多表连接时连接列创建索引;
where子句查询的列;
需要经常GROUP BY和ORDER BY的列;
-
不使用情况:
对数据有大量重复值的数据不使用索引(比如说性别,通常使用0 1);
表中的数据内容较少不使用索引;
需要频繁更新的字段不推荐使用索引;
11.索引失效的情况?
- like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效;
- or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效;
- 数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描;
- 在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0;
12.索引的优化策略?
- 最左前缀匹配原则;
- 主键外检一定要建索引;
- 对 where,group by,order by 中出现的列使用索引;
- 不要过多创建索引, 权衡索引个数与DML之间关系,DML也就是插入、删除数据操作。这里需要权衡一个问题,建立索引的目的是为了提高查询效率的,但建立的索引过多,会影响插入、删除数据的速度;
13.左连接,右连接,内连接的区别?分别在什么情况下使用?
- 使用左连接的话,以左边为主表,右边为从表,当右表没有符合的数据则会显示为null;
- 使用右连接的话,以右边为主表,左边为从表,当左表没有符合的数据则会显示为null;
- 内连接也算是对他们两者的一个结合,只会显示左右表都符合的数据;
- 使用情况总结就是:是否要全部展示,什么数据需要全部展示,是否要展示符合条件的数据;