Java面试-数据库篇MySql,助战2020

破局之路课程 2024-03-24 14:57:41
相信技术改变我的生活,加油! 一、事务四大特性1、原子性:要么执行,要么不执行,也就是不可再分,已经最小了。 2、隔离性:所有操作全部执行完以前,其他会话不能看到过程。 3、一致性:事务前后,数据总额一致。 4、持久性:一旦事务提交,对数据的改变就是永久的。 二、数据库隔离级别1、脏读:事务B读取事务A还没有提交的数据。 2、不可重复度:两次事务读到的数据不一致。 3、幻读:事务A修改了数据,事务B也修改了数据,这时在事务A看来,明明修改了数据咋不一致。 三、MySQL的两种存储引擎的区别MYISAM: 1、不支持外键;表锁,插入数据时,锁定整个表;查表总行数时,不需要全表扫描。 2、不支持事务,但是整个操作时原子性的。 3、存储总行数,执行select count(*) from table时 只需要获取总行数即可。 4、一个MYISAM表有三个文件:索引文件,表结构文件,数据文件。 5、采用非聚集索引,索引文件数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。 6、支持全文索引和空间索引。 7、对于AUTO_INCREMENT类型的字段,在MyISAM表中,可以和其他字段一起建立联合索引。 INNODB: 1、支持事务。 2、支持行锁和外键约束,因此支持并发。 3、不存储总行数;也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。 4、对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引 5、DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除 6、一个Innodb表存储在一个文件内(共享表空间,表大小不受操作系统的限制),也可能为多个(设置为独立表空间,表大小受操作系统限制,大小为2G),受操作系统文件大小的限制 7、主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问主键索引;最好使用自增主键,为维持B+树结构,文件的大调整。 四、描述一下mysql的索引索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。上述SQL语句,在没有索引的情况下,数据库会遍历全部200条数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。如果我们把SQL语句换成“SELECT * FROM article WHERE id=2000000”,那么你是希望数据库按照顺序读取完200万行数据以后给你结果还是直接在索引中定位呢?上面的两个图片鲜明的用时对比已经给出了答案(注:一般数据库默认都会为主键生成索引)。 索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。 索引失效情况: 1、类型要一致,如果是varchar字段用了int类型 去查询,索引将失效。 2、Like查询以’%’开头用不到索引,%结尾能用索引。 3、Where语句中使用<> != 。 4、Where语句中使用or,但是没有把or的所有字段加上索引。这种情况使用索引需要将or中的索引字段加上索引。 5、Where语句中对字段表达式操作。 6、Where语句中使用not in。 7、多索引,没有使用第一部分,则放弃索引。 Btree与hash索引: 1、btree树索引列是顺序组织存储的,所以很适合查找范围数据。 2、哈希索引:基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列的值计算一个哈希码,哈希码是一个较小的值,并且不同键值的行计算出来的哈希码不一样,哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。 参考文档:https://www.cnblogs.com/xiaoboluo768/p/5164342.html https://www.cnblogs.com/rgever/p/9736374.html 五、如何查看索引使用情况explain显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。查看是否使用索引,简单的看type类型就可以。如果它是all,那说明这条查询语句遍历了所有的行,并没有使用到索引。 explain select * from company_info where cname like '%小%' 1)、id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询。 2)、select_type列常见的有: A:simple:表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple,且只有一个 B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。且只有一个 C:union:union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union D:dependent union:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响 E:union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null F:subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery G:dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响 H:derived:from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select 4)、type 依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL,除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引 A:system:表中只有一行数据或者是空表,且只能用于myisam和memory表。如果是Innodb引擎表,type列在这个情况通常都是all或者index B:const:使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type是const。其他数据库也叫做唯一索引扫描 C:eq_ref:出现在要连接过个表的查询计划中,驱动表只返回一行数据,且这行数据是第二个表的主键或者唯一索引,且必须为not null,唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref D:ref:不像eq_ref那样要求连接顺序,也没有主键和唯一索引的要求,只要使用相等条件检索时就可能出现,常见与辅助索引的等值查找。或者多列主键、唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据不唯一的等值查找就可能出现。 E:fulltext:全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引 F:ref_or_null:与ref方法类似,只是增加了null值的比较。实际用的不多。 G:unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值 H:index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重。 I:range:索引范围扫描,常见于使用>,<,is null,between ,in ,like等运算符的查询中。 j:index_merge:表示查询使用了两个以上的索引,最后取交集或者并集,常见and ,or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由于要读取所个索引,性能可能大部分时间都不如range k:index:索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。 l:all:这个就是全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录。 六、索引优缺点1、索引最大的好处是提高查询速度。 2、缺点是更新数据时效率低,因为要同时更新索引。 3、对数据进行频繁查询进建立索引,如果要频繁更改数据不建议使用索引。 七、索引的底层实现(B+树,为何不采用红黑树B树)1、红黑树:增加、删除红黑树会进行频繁的调整,来保证红黑树的性质,浪费时间。 2、B树也就是B-树,查询性能不稳定,查询结果高度不一致,每个节点保存指向真实数据的指针,相比B+树每一层存储的元素更多,显得更高一些。 3、B+树相比另两种树,显得更矮更宽,查询层次浅。 B+树的优势: 1、单个节点可以存储更多的数据,减少I/O的次数。 2、查找性能更稳定,因为都是要查找到叶子结点。 3、叶子结点形成了有序链表,便于查询。 八、索引分类普通索引:最基本的索引,没有任何限制 唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。 主键索引:它是一种特殊的唯一索引,不允许有空值。 全文索引:针对较大的数据,生成全文索引很耗时好空间。 组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则 九、死锁怎么解决1、找到进程号 2、Kill掉 十、如何尽可能避免死锁1)以固定的顺序访问表和行。即按顺序申请锁,这样就不会造成互相等待的场面。 2)大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小。 3)在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率。 4)降低隔离级别。如果业务允许,将隔离级别调低也是较好的选择,比如将隔离级别从RR调整为RC,可以避免掉很多因为gap锁造成的死锁。 5)为表添加合理的索引。如果不走索引将会为表的每一行记录添加上锁,死锁的概率大大增大。
0 阅读:0

破局之路课程

简介:感谢大家的关注