MySql基础知识(⾼频⾯试题)
事务的四⼤特性?
事务特性ACID:原⼦性(Atomicity)、⼀致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
1.原⼦性是指事务包含的所有操作要么全部成功,要么全部失败回滚。
2.⼀致性是指⼀个事务执⾏之前和执⾏之后都必须处于⼀致性状态。⽐如a与b账户共有1000块,两⼈之间转账之后⽆论成功还是失
败,它们的账户总和还是1000。
3.隔离性。跟隔离级别相关,如read committed,⼀个事务只能读到已经提交的修改。
4.持久性是指⼀个事务⼀旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢
失提交事务的操作
数据库的三⼤范式
第⼀范式1NF
确保数据库表字段的原⼦性。
⽐如字段 userInfo: ⼴东省 10086’ ,依照第⼀范式必须拆分成 userInfo: ⼴东省 userTel:10086两个字段。
第⼆范式2NF
⾸先要满⾜第⼀范式,另外包含两部分内容,⼀是表必须有⼀个主键;⼆是⾮主键列必须完全依赖于主键,⽽不能只依赖于主键的⼀部分。
举个例⼦。假定选课关系表为
student_course(student_no, student_name, age,
course_name, grade, credit),主键为(student_no,course_name)。
其中学分完全依赖于课程名称,姓名年龄完全依赖学号,不符合第⼆范式,会导致数据冗余(学⽣选n
门课,姓名年龄有n条记录)、插⼊异常(插⼊⼀门新课,因为没有学号,⽆法保存新课记录)等问题。
可以拆分成三个表:
学⽣:student(stuent_no, student_name,年龄);
课程:course(course_name,credit);mysql面试题基础知识
选课关系:student_course_relation(student_no, course_name, grade)。
第三范式3NF
⾸先要满⾜第⼆范式,另外⾮主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:⾮主键列 A 依赖于⾮主键列 B,⾮主键列 B
依赖于主键的情况。
假定学⽣关系表为Student(student_no, student_name, age, academy_id, academy_telephone),主键为"学号",其中学院id依赖于学号,⽽学院地点和学院电话依赖于学院id,存在传递依赖,不符合第三范式。
可以把学⽣关系表分为如下两个表:
学⽣:(student_no, student_name, age,academy_id);
学院:(academy_id, academy_telephone)。
2NF和3NF的区别?
2NF依据是⾮主键列是否完全依赖于主键,还是依赖于主键的⼀部分。 3NF依据是⾮主键列是直接依赖于主键,还是直接依赖于⾮主键。
事务隔离级别有哪些?
先了解下⼏个概念:脏读、不可重复读、幻读。
脏读是指在⼀个事务处理过程⾥读取了另⼀个未提交的事务中的数据。
不可重复读是指在对于数据库中的某⾏记录,⼀个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,另⼀个事务修改了数据并提交了。
幻读是当某个事务在读取某个范围内的记录时,另外⼀个事务⼜在该范围内插⼊了新的记录,当之前
的事务再次读取该范围的记录时,会产⽣幻⾏,就像产⽣幻觉⼀样,这就是发⽣了幻读。
不可重复读和脏读的区别是,脏读是某⼀事务读取了另⼀个事务未提交的脏数据,⽽不可重复读则是读取了前⼀事务提交的数据。
幻读和不可重复读都是读取了另⼀条已经提交的事务,不同的是不可重复读的重点是修改,幻读的重点在于新增或者删除。
事务隔离就是为了解决上⾯提到的脏读、不可重复读、幻读这⼏个问题。
MySQL数据库为我们提供的四种隔离级别:
Serializable (串⾏化):通过强制事务排序,使之不可能相互冲突,从⽽解决幻读问题。
Repeatable read (可重复读):MySQL的默认事务隔离级别,它确保同⼀事务的多个实例在并发读取数据时,会看到同样的数据⾏,解决了不可重复读的问题。
Read committed (读已提交):⼀个事务只能看见已经提交事务所做的改变。可避免脏读的发⽣。
Read uncommitted(读未提交):所有事务都可以看到其他未提交事务的执⾏结果。
查看隔离级别:
select @@transaction_isolation;
设置隔离级别:
set session transaction isolation level read uncommitted;
什么是索引?
索引是存储引擎⽤于提⾼数据库表的访问速度的⼀种数据结构。
索引的优缺点?
优点:
加快数据查的速度 为⽤来排序或者是分组的字段添加索引,可以加快分组和排序的速度 加快表与表之间的连接
缺点:
adding建⽴索引需要占⽤物理空间 会降低表的增删改的效率,因为每次对表记录进⾏增删改,需要进⾏动态维护索引,导致增删改时间变长
索引的作⽤?
数据是存储在磁盘上的,查询数据时,如果没有索引,会加载所有的数据到内存,依次进⾏检索,读取磁盘次数较多。有了索引,就不需要加载所有数据,因为B+树的⾼度⼀般在2-4层,最多只需要读取2-4次磁盘,查询速度⼤⼤提升。
什么情况下需要建索引?
1.经常⽤于查询的字段
2.经常⽤于连接的字段建⽴索引,可以加快连接的速度
3.经常需要排序的字段建⽴索引,因为索引已经排好序,可以加快排序查询速度
二维数组列优先求地址
什么情况下不建索引?
1.where条件中⽤不到的字段不适合建⽴索引
2.表记录较少
3.需要经常增删改
4.参与列计算的列不适合建索引
5.区分度不⾼的字段不适合建⽴索引,如性别等
索引的数据结构
中文学区乱码2020一二三mysql>show index from blog\G;
***************************1.row***************************
Table: blog
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: blog_id
Collation: A
Cardinality: 4
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
Visible: YES
Expression: NULL
哈希索引
哈希索引是基于哈希表实现的,对于每⼀⾏数据,存储引擎会对索引列进⾏哈希计算得到哈希码,并且哈希算法要尽量保证不同的列值计算出的哈希码值是不同的,将哈希码的值作为哈希表的key值,将指向数据⾏的指针作为哈希表的value值。这样查⼀个数据的时间复杂度就是O(1),⼀般多⽤于精确查。
Hash索引和B+树索引的区别?
1.哈希索引不⽀持排序,因为哈希表是⽆序的。
2.哈希索引不⽀持范围查。
3. 哈希索引不⽀持模糊查询及多列索引的最左前缀匹配。
4.因为哈希表中会存在哈希冲突,所以哈希索引的性能是不稳定的,⽽B+树索引的性能是相对稳定的,每次查询都是从根节点到叶⼦
节点。
为什么B+树⽐B树更适合实现数据库索引?
1.由于B+树的数据都存储在叶⼦结点中,叶⼦结点均为索引,⽅便扫库,只需要扫⼀遍叶⼦结点即可,但是B树因为其分⽀结点同样
存储着数据,我们要到具体的数据,需要进⾏⼀次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,⽽在数据库中基于范围的查询是⾮常频繁的,所以通常B+树⽤于数据库索引。
2.B+树的节点只存储索引key值,具体信息的地址存在于叶⼦节点的地址中。这就使以页为单位的索引中可以存放更多的节点。减少
更多的I/O⽀出。
3.B+树的查询效率更加稳定,任何关键字的查必须⾛⼀条从根结点到叶⼦结点的路。所有关键字查询的路径长度相同,导致每⼀个
数据的查询效率相当。
索引有什么分类?
1、主键索引:名为primary的唯⼀⾮空索引,不允许有空值。
2、唯⼀索引:索引列中的值必须是唯⼀的,但是允许为空值。唯⼀索引和主键索引的区别是:唯⼀约束的列可以为null且可以存在多
个null值。唯⼀索引的⽤途:唯⼀标识数据库表中的每条记录,主要是⽤来防⽌数据重复插⼊。创建唯⼀索引的SQL语句如下:ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE KEY(column_1,column_2,...);
3、组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使⽤了这些字段的左边字段时,索引才会被使⽤,使⽤组合索
引时需遵循最左前缀原则。
4、全⽂索引:只有在MyISAM引擎上才能使⽤,只能在CHAR、VARCHAR和TEXT类型字段上使⽤全⽂索引。
什么是最左匹配原则?
什么是聚集索引?
InnoDB使⽤表的主键构造主键索引树,同时叶⼦节点中存放的即为整张表的记录数据。聚集索引叶⼦节点的存储是逻辑上连续的,使⽤双向链表连接,叶⼦节点按照主键的顺序排序,因此对于主键的排序查和范围查速度⽐较快。
聚集索引的叶⼦节点就是整张表的⾏记录。InnoDB 主键使⽤的是聚簇索引。聚集索引要⽐⾮聚集索引查询效率⾼很多。
对于InnoDB来说,聚集索引⼀般是表中的主键索引,如果表中没有显⽰指定主键,则会选择表中的第⼀个不允许为NULL的唯⼀索引。如果没有主键也没有合适的唯⼀索引,那么InnoDB内部会⽣成⼀个隐藏的主键作为聚集索引,这个隐藏的主键长度为6个字节,它的值会随着数据的插⼊⾃增。
什么是覆盖索引?
select的数据列只⽤从索引中就能够取得,不需要回表进⾏⼆次查询,也就是说查询列要被所使⽤的索引覆盖。对于innodb表的⼆级索引,如果索引能覆盖到查询的列,那么就可以避免对主键索引的⼆次查询。
不是所有类型的索引都可以成为覆盖索引。覆盖索引要存储索引列的值,⽽哈希索引、全⽂索引不存储索引列的值,所以MySQL使⽤b+树索引做覆盖索引。
对于使⽤了覆盖索引的查询,在查询前⾯使⽤explain,输出的extra列会显⽰为using index。
⽐如user_like ⽤户点赞表,组合索引为(user_id, blog_id),user_id和blog_id都不为null。
explain select blog_id from user_like where user_id = 13;
explain结果的Extra列为Using
index,查询的列被索引覆盖,并且where筛选条件符合最左前缀原则,通过索引查就能直接到符合条件的数据,不需要回表查询数据。
explain select user_id from user_like where blog_id = 1;
explain结果的Extra列为Using where; Using index,
查询的列被索引覆盖,where筛选条件不符合最左前缀原则,⽆法通过索引查到符合条件的数据,但可以通过索引扫描到符合条件的数据,也不需要回表查询数据。
索引的设计原则?
1.索引列的区分度越⾼,索引的效果越好。⽐如使⽤性别这种区分度很低的列作为索引,效果就会很差。
2.尽量使⽤短索引,对于较长的字符串进⾏索引时应该指定⼀个较短的前缀长度,因为较⼩的索引涉及到的磁盘I/O较少,查询速度更
快。
3.索引不是越多越好,每个索引都需要额外的物理空间,维护也需要花费时间。
4.利⽤最左前缀原则。
索引什么时候会失效?
导致索引失效的情况:
1.对于组合索引,不是使⽤组合索引最左边的字段,则不会使⽤索引
2.以%开头的like查询如%abc,⽆法使⽤索引;⾮%开头的like查询如abc%,相当于范围查询,会使⽤索引
3.查询条件中列类型是字符串,没有使⽤引号,可能会因为类型不同发⽣隐式转换,使索引失效
4.判断索引列是否不等于某个值时
5.对索引列进⾏运算
6.查询条件使⽤or连接,也会导致索引失效
什么是前缀索引?
有时需要在很长的字符列上创建索引,这会造成索引特别⼤且慢。使⽤前缀索引可以避免这个问题。
前缀索引是指对⽂本或者字符串的前⼏个字符建⽴索引,这样索引的长度更短,查询速度更快。
创建前缀索引的关键在于选择⾜够长的前缀以保证较⾼的索引选择性。索引选择性越⾼查询效率就越⾼,因为选择性⾼的索引可以让MySQL在查时过滤掉更多的数据⾏。
建⽴前缀索引的⽅式:
// email列创建前缀索引 ALTER TABLE table_name ADD
KEY(column_name(prefix_length));
常见的存储引擎有哪些?
MySQL中常⽤的四种存储引擎分别是: MyISAM、InnoDB、MEMORY、ARCHIVE。MySQL 5.5版本后默认的存储引擎为InnoDB。
InnoDB存储引擎swift中文教程
InnoDB是MySQL默认的事务型存储引擎,使⽤最⼴泛,基于聚簇索引建⽴的。InnoDB内部做了很多
优化,如能够⾃动在内存中创建⾃适应hash索引,以加速读操作。
resultsetmetadata常用方法优点:⽀持事务和崩溃修复能⼒;引⼊了⾏级锁和外键约束。
缺点:占⽤的数据空间相对较⼤。
适⽤场景:需要事务⽀持,并且有较⾼的并发读写频率。
MyISAM存储引擎
数据以紧密格式存储。对于只读数据,或者表⽐较⼩、可以容忍修复操作,可以使⽤MyISAM引擎。MyISAM会将表存储在两个⽂件中,数据⽂件.MYD和索引⽂件.MYI。
优点:访问速度快。
缺点:MyISAM不⽀持事务和⾏级锁,不⽀持崩溃后的安全恢复,也不⽀持外键。
适⽤场景:对事务完整性没有要求;表的数据都会只读的。
MEMORY存储引擎
MEMORY引擎将数据全部放在内存中,访问速度较快,但是⼀旦系统奔溃的话,数据都会丢失。
MEMORY引擎默认使⽤哈希索引,将键的哈希值和指向数据⾏的指针保存在哈希索引中。
优点:访问速度较快。
缺点:
1.哈希索引数据不是按照索引值顺序存储,⽆法⽤于排序。
2. 不⽀持部分索引匹配查,因为哈希索引是使⽤索引列的全部内容来计算哈希值的。
3.只⽀持等值⽐较,不⽀持范围查询。 当出现哈希冲突时,存储引擎需要遍历链表中所有的⾏指针,逐⾏进⾏⽐较,直到到符合条
件的⾏。
ARCHIVE存储引擎

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。