- 谈一谈对数据库三大范式的理解
第一范式:第一范式是最基本的范式。如果数据库表中的所有字段值都是不可再拆分,就说明该数据库表满足了第一范式。强调原子性
第二范式:在第一范式的基础上,必须要有主键,且所有列都必须完全依赖于主键,不能依赖主键的一部分。强调每一列都与主键相关
第三范式:在第二范式的基础上,所有列必须直接依赖于主键,不能存在传递依赖。不能c依赖于b,b再依赖于a
mysql常用的两种数据库引擎是什么?他们的区别
mysql存储引擎总共有九种,常用的数据引擎有myisam和innodb
mysql5.5之前默认的存储引擎是myisam,之后默认innodb
myisam:这种不支持事务和外键,不支持行级锁,只支持表锁,适合多用于查询的表
innodb:支持事务和外键。有表锁、行锁、整体较为全面,目前主流数据库引擎什么是事务?事务的四大特性是什么
数据库的事务是指一组sql语句,在这组sql的操作中,要么全部执行成功,要么全部失败
1.原子性:事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么都成功,要么都失败。任何一项操作都会导致整个事务的失败,同时其他已经被执行的操作都将被撤销回滚,只有所有的操作全部成功,整个事务才算是成功完成
2.一致性:事务的一致性是指事务在执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态
3.隔离性:事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其他事务干扰。也就是说不同事物并非操作相同数据时,每个事务都有完整的数据空间
一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务是不能互相干扰的
4.持久性:是指事务一但提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃等故障,只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态事务的隔离级别有哪些?不同的隔离级别可能产生哪些问题
共四种隔离级别:
1.读未提交:一个事务还没有提交时,它做的变更就能被别的事务看到。可能出现脏读。
2.读提交:一个事物提交之后,它做的变更才会被其他事务看到。可能出现不可重复读。
3.可重复读:一个事物执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。未提交变更对其他事务也是不可见的。可能出现幻读。(mysql默认的事务隔离级别)
4.可序化:提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读。
可能导致的问题:
1.脏读:事务A读到事务B未提交的更新数据。如果事务B回滚了,则事务A就可能导致数据问题。
可能导致的问题:
2.不可重复读:一个事务两次读同一行数据,可是这两次读到的数据不一样。在事务进行过程中,查询的数据可以被其他事务修改。
3.幻读:一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行。在事务进行过程中,查询的数据不会被其他事务修改,但是不影响其他事务添加新数据,类似行锁。mysql三层逻辑架构是什么
第一层负责数据库的连接、授权认证、安全
第二层包括查询缓存,解析器,优化器。编译sql语句,并对其进行优化(如调整表的读取顺序,选择合适的索引)。对于select语句,在解析查询前,服务器会先检查查询缓存,如果能在其中找到对应的查询结果,则无需再进行查询解析、优化等过程,直接返回查询结果。存储过程、触发器、视图等都在这一层实现
第三层是存储引擎。存储引擎负责在MySQL中存储数据、提取数据、开启一个事务等等。存储引擎通过API与上层进行通信,这些API屏蔽了不同存储引擎之间的差异,使得这些差异对上层查询过程透明。存储引擎不会去解析SQL。mysql中in的数据量最大是多少?
mysql中in的数据量没有限制,只是收sql语句长度的限制。oracle中in的数据量有限制,最多不能超过1000个什么是索引
索引是帮助MySQL高效获取数据的数据结构。查询一条数据需遍历整个表,当表中数据量变的很大时,查询速度就会很慢。
索引就是用来解决查询速度慢的情况。索引就好比字典里的目录,如果没有目录,查询一个字我们需要翻遍一本字典,有了目录之后查询一个字就会变的非常快。
在MyISAM和InnoDB存储引擎中,索引的数据结构是B+树或者hash,默认B+树。索引的分类
1.普通索引:加速查找。
2.唯一索引
主键索引:primary key:加速查找+约束(不为空且唯一)。
唯一索引:unique︰加速查找+约束(唯一)。
3.联合索引
primary key(id,name):联合主键索引。unique(id,name):联合唯一索引。index(id,name):联合普通索引。
4.全文索引fulltext:用于搜索很长一篇文章的时候,效果最好。
唯一索引和主键索引唯一的区别:主键索引不能为null索引的优劣势是什么
优势:
1.可以提高数据检索的效率,降低数据库的IO成本。
2.通过索引列对数据进行排序,降低了CPU的消耗。
劣势:
1.占磁盘空间,需要保存索引数据,比较大。
2.更新表的同时需要更新索引,降低更新表的效率。什么情况下不适合加索引
1.表内数据量太少
2.该字段在表中数据重复过多,识别率太低,比如性别字段
3.一个表需要频繁的插入和修改,不适合建索引什么是最左匹配原则
对于联合索引,总是从索引的最前面字段开始进行查找,接着往后,中间不能跳过。比如创建了多列索引(name,age,sex),会先匹配name字段,再匹配age字段,再匹配sex字段的,中间不能跳过。mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。
因此创建联合索引时,要尽量把辨识度高且能使用索引的字段(没有使用范围查询)放在前面。
where后面不需要按照索引的顺序来,因为mysql的sql优化器会自动优化。但是,索引中的字段where后面必须要有,可以不全有,但是索引最左边的字段必须要存在。什么是覆盖索引
InnoDB存储引擎根据索引类型不同,分为聚簇索引和非聚簇索引。它们区别在于,聚簇索引的叶子节点存放的是实际数据,所有完整的用户数据都存放在聚簇索引的叶子节点,而非聚簇索引的叶子节点存放的是主键值,而不是实际数据。一个表中只有主键索引是聚簇,其他的索引都是非聚簇索引。
在我们使用非聚簇索引字段作为条件查询的时候,正常情况下需要检索两颗B+树,先在非聚簇索引的B+树找到对应的叶子节点,获取主键值。然后用获取的主键值,在聚簇索引中的B+树检索到对应的叶子节点,然后获取要查询的数据。上面这个过程叫做回表。
如果我们用非聚簇索引时,需要查询的字段正好都被非聚簇索引中的字段所包含,那么就不需要回表,在非聚簇索引的叶子节点中就可以获取所需的数据,这就叫做覆盖索引。哪些情况下不走索引
1.索引列参与了计算。
2.索引列上使用了函数。
3.索引列使用了like ‘%XX’或%XX%’。
4.隐式转换,字符串列与数字比较,不走索引。
5.尽量避免OR操作,只要有一个字段没有索引,该语句就不走索引。
6.使用!=或者>判断。
7.is null, is not null。
8.in会走索引,但是当in范围太大时,可能会全表扫描。
9.联合索引中,某个字段使用了范围条件(in,between,>,<)则后面的字段不会用到索引。explain性能分析
写完一个sql之后,如何判断该sql是否使用了索引?执行性能如何?mysql提供了一个关键字explain来帮助使用者对sql进行性能分析。
使用方法是在select语句前面加上explain即可。explain select name from student;
查询出来的字段中其中几个比较重要的是:
1.type:显示的是查询使用了哪种类型,type从最好到最差依次是:system>const>eq_ref>ref>range>index>all。
2.possible_keys:显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引|将被列出,但不一定被查询实际使用。
3.key:实际使用的索引,如果为NULL,则没有使用索引。(可能原因包括没有建立索引或索引失效)
4.rows:根据表统计信息及索引|选用情况,大致估算出找到所需的记录所需要读取的行数,也就是说,用的越少越好。
5.Extra:一些非常重要的额外信息。
Using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引|顺序进行读取。MySQL中无法利用索引|完成的排序操作称为“文件排序”。
Using temporary:使用了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。
Using index:表示相应的select操作中使用了覆盖索引,避免访问了表的数据行,效率不错。什么是redolog、undolog、binlog?
undolog和redolog是innodb存储引擎层的日志,binlog是MySQL Server层记录的日志。
1.redolog:redolog是InnoDB存储引擎层的日志,又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。数据库不是每次增删改操作都会立马修以蚁掂厍义1+,力p样效率太低。会先将数据写入缓存和日志文件中,等到特定时间点写入数据库文件。如果数据写入缓存而没有写入数据库文件时,数据库宕机了,redolog文件就能派上用场。重启后InnoDB存储引擎会使用redolog恢复到宕机前的时刻,以此来保证数据的完整性。
2.undolog:undolog是回滚日志,记录的是数据修改之前的值,主要用于数据回滚操作。
3.binlog:二进制日志,它记录了每一条会修改数据的sql,并以二进制的形式保存在磁盘中,它可以用来查看数据库的变更历史、数据库增量备份和恢复、MySQL的复制(主从数据库的复制)。mysql锁有哪些
MyISAM存储引擎只支持表锁,InnoDB存储引擎表锁和行锁都支持。
读锁(共享锁)︰允许其他线程读取数据,但是不允许修改。读锁可以同时获取多个。
写锁(排他锁)︰不允许其他线程读和写,写锁存在时只能存在一个,且其他任何锁都不能存在。
对于InnoDB存储引擎,是根据索引来加职,如果系大效会导致行锁变为表锁。同时对于增删改操作,会自动加上排他锁,查询操作不会加共享锁。
共享锁和排他锁可以手动添加,共享锁在sql语句后面加LOCK IN SHARE MODE,排他锁在sql语句后面加FOR UPDATE。
除了以上两种常用的锁,innoDB自己维护了两种锁,意向排他锁和意向共享锁。这两种锁是表级锁,是为了提高加表锁效率的。sql语句主要分为哪几类
1.数据定义语言DDL(Data Ddefinition Language):主要为CREATE,DROP,ALTER,主要对逻辑结构进行操作,其中包括表结构,视图和索引。
2.数据查询语言DQL(Data Query Language):主要为SELECT等各种简单查询,连接查询等都属于DQL。
3.数据操纵语言DML(Data Manipulation Language):主要为INSERT,UPDATE,DELETE,对数据进行操作的,DQL与DML共同构建了多数初级程序员常用的增删改查操作。
4.数据控制功能DCL(Data Control Language):主要为GRANT,REVOKE,COMMIT,ROLLBACK,对数据库安全性完整性等有操作的,可以简单的理解为权限控制等。