MySQL篇

数据库基础与优化
本文介绍了数据库的基本概念,包括三范式、MySQL引擎、InnoDB与MyISAM的区别、事务特性、索引的作用以及SQL优化手段等,帮助读者理解数据库的工作原理并掌握优化技巧。

1、数据库的三范式是什么

第一范式:列不可再分。

第二范式:行可以唯一区分,主键约束。

第三范式:表的非主属性不能依赖与其他表的非主属性,外键约束,且三大范式是一级一级依赖的

第二范式建立在第一范式上,第三范式建立在第一第二范式上。

2、MySQL数据库引擎有哪些

 mysql常用引擎包括:MYISAM、Innodb、Memory、MERGE

MYISAM:全表锁,拥有较高的执行速度,不支持事务,不支持外键,并发性能差,占用空间相对较小,对事务完整性没有要求

Innodb:行级锁,提供了具有提交,回滚,崩溃回复能力的事务安全,支持自动增长列。支持外键约束,并发能力强,处理效率相对会差一点

Memory:全表锁,存储在内容中,速度快,但会占用和数据量成正比的内存空间且数据在mysql重启时会丢失,默认使用HASH索引,检索效率高,但不适合精确查找。

MERGE:是一组MYISAM表的组合

3、说说InnoDB与MyISAM的区别  

1.InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务务,自动提
交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;

2.InnoDB支持外键,,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;

3.InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。
但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该
过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,
索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用
一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
5. Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;

4、数据库的事务
什么是事务?: 多条sql语句,要么全部成功,要么全部失败。事务的特性:
数据库事务特性:原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性
(Durabiliy)。简称ACID。
原子性:组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有操作都成功,
整个事务才会提交。任何一个操作失败,已经执行的任何操作都必须撤销,让数据库返回初始
状态。
一致性:事务操作成功后,数据库所处的状态和它的业务规则是一致的。即数据不会被破坏。
如A转账100元给B,不管操作是否成功,A和B的账户总额是不变的。
隔离性:在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对彼此产生干

持久性:一旦事务提交成功,事务中的所有操作都必须持久化到数据库中。

5、索引是什么

高效获取数据的数据结构,能加快数据库的查询速度

索引往往是在存储在磁盘上的文件中的,我们通常所说的索引,包括聚集索引,覆盖索引,组合索引,前缀索引,唯一索引,没有特别说明,默认使用B+树的索引

6、SQL优化手段有哪些

1、查询语句中不要使用select *

2、尽量减少子查询,使用关联查询(left join,right join,inner join)替代

3、减少使用IN或者NOT IN ,使用exists,not exists或者关联查询语句替代

4、or 的查询尽量用 union或者union all 代替(在确认没有重复数据或者不用剔除重复数据时,
union all会更好)

5、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
6、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表
扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有
null值,然后这样查询: select id from t where num=0

7、简单说一说drop、delete与truncate的区别

SQL中的drop、delete、truncate都表示删除,但是三者有一些差别

delete和trunate只删除表的数据不删除表的结构,速度一般来说: drop> truncate >delete delete
语句是dml,这个操作会放到rollback segement中,事务提交之后才生效; 如果有相应的trigger,执行
的时候将被触发. truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚.
操作不触发trigger

8、什么是视图

视图是一种虚拟的表,具有物理表相同的功能,可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集,对视图的修改不影响基本表,他使得我们获取数据更容易,相对于多表查询

9、并发事务带来哪些问题?

脏读:当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据,因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据就是“脏数据”,依据“脏数据”所做的操作可能是不正确的

丢失修改:指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改,因此称为丢失修改。

不可重复读:指在一个事务内多次读同一数据,在这个事务还没有结束时,另一个事务也访问了该数据,那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样,这就发生了在一个事务内两次读到的数据是不一样的情况,因此成为不可重读

幻读:幻读与不可重复读类似,他发生在一个事务(t1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时,在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

不可重复读和幻读区别:

不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现增多或者减少了

10,事务隔离级别有哪些?MySQL的默认隔离级别是?

SQL 标准定义了四个隔离级别:
READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,
能会导致脏读、幻读或不可重复读。

READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是
幻读或不可重复读仍有可能发生。

REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身
事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐
个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读
以及幻读。

mysql InnoDB存储引擎的默认支持的隔离级别是REPLACE-READ(可重复读) 

所以说InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLEREAD(可重读) 已经可以完全保证事务的隔离性要求,即达到了 SQL标准的 SERIALIZABLE(可串行化) 隔离级别。因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容) ,但是你要知道的是InnoDB 存储引擎默认使用REPEAaTABLE-READ(可重读) 并不会有任何性能损失。

InnoDB存储引擎在分布式事务的情况下一般会用到SERIALIZABLE(可串行化)隔离级别

11.索引有什么有优缺点?

优点:提高数据的索引速度,降低数据库IO成本

使用索引的意义就是通过缩小表中需要查询的记录的数目从而加快搜索的速度

降低数据排序的成本,降低cpu消耗,索引之所有查的快,是因为先将数据排好序,则正好降低了排序的成本。

缺点:占用存储空间,索引实际上也是一张表,记录了主键与索引字段,一般以索引文件的形式存储在磁盘上。

降低更新表的速度:表的数据发生变化,对应的索引也需要一起变更

从而减低的更新速度,否则索引指向的物理数据可能不对,这也是索引失效的原因之一

在 MySQL 5.1 及之前的版本中,MyISAM 是默认的存储引擎,而在 MySQL 5.5 版本以后,默
认使用 InnoDB 存储引擎。

InnoDB 是事务型引擎,当事务异常提交时,会被回滚。同时,InnoDB 支持行锁。此外,
InnoDB 需要更多存储空间,会在内存中建立其专用的缓冲池用于高速缓冲数据和索引。
InnoDB 支持自动奔溃恢复特性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值