<>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;
* 内连接也算是对他们两者的一个结合,只会显示左右表都符合的数据;
* 使用情况总结就是:是否要全部展示,什么数据需要全部展示,是否要展示符合条件的数据;

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信