MySQL是一种关系型数据库,它开源免费(GPL),扩展方便,稳定性也有保障,因此在企业级开发中常常使用。MySQL默认端口号是3306。
查看MySQL提供的所有存储引擎:
mysql> show engines
MySQL的默认存储引擎是InnoDB
,并且在5.7版本的所有存储引擎中只有InnoDB是事务性存储引擎,也就是说只有InnoDB支持事务。
MySQL索引使用的数据结构主要有BTree索引和哈希索引。哈希索引底层数据结构就是哈希表,因此绝大多数需求为单条记录查询时,可以选择哈希索引,查询性能最快(O(1));其余大部分场景,建议使用BTree索引。
MySQL的BTree索引具体指B+Tree,但在主要的两种存储引擎的实现方式是不同。
data
域存放的是数据记录的地址。在索引检查的时候,首先按照B+树搜索算法搜索索引,如果指定的Key存在,则取出其data
域的值,然后根据data
域的地址值读取相应的数据记录。这被称为“非聚簇索引”。MyISAM索引文件和数据文件是分离的。
InnoDB
存储引擎的B+树索引可以分为聚簇索引和辅助索引(非聚簇索引或者二级索引)。InnoDB索引表数据文件本身就是按照B+树组织的一个索引结构,树的叶子结点data
域保存了完整的数据记录。索引和数据是存储在一起的。
聚簇索引就是按每张表的主键构造一棵B+树,同时叶子节点中存放的是整张表的行记录数据,因此也将聚簇索引的叶子节点也称为数据页,这个特性决定了索引组织表中的数据也是索引的一部分。
日常工作中,根据实际情况自行添加的索引都是辅助索引(非聚簇索引)。辅助索引是为了查找主键索引而建立的二级索引,先在辅助索引中找到主键索引,再使用主键索引在主索引中查找数据。也由于辅助索引的二次查询过程,在设计表的时候,不建议使用过长的字作为字段,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。
事务就是逻辑上的一组操作,要么都执行,要么都不执行。
不可重复度和幻读的区别: 不可重复读的重点是修改不如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或者减少了。
SQL标准定义了四个隔离级别:
READ-UNCOMMITED
(读取未提交):最低的隔离级别,允许尚未提交的数据变更,可能会导致脏读、幻读和不可重复读。READ-COMMITED
(读取已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读和不可重复读还是会方式REPEATABLE-READ
(可重复读):对同一字段的多次读取结果是一致的,除非数据是被本身事务自己修改,可以阻止脏读和不可重复读,但幻读还是有可能发生。SERIALIZABLE
(可串行化):最高的隔离级别,完全服从ACID的隔离级别。所有事务依次逐个执行。这样事务之间完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。MySQL InnoDB存储引擎默认支持的隔离级别是REPEATABLE-READ
。
注意:虽然InnoDB存储引擎采取REPEATABLE-READ
隔离级别,但是它使用Next-key Lock算法,因此也可以避免幻读的产生,这与其他数据库(SQL Server)是不同的。InnoDB已经可以完全保证事务的隔离性要求,即达到了SQL标准的SERIALIZABLE(可串行化)隔离级别。因为隔离级别越低,事务需要请求的锁越少,所以大部分数据库的隔离级别都是READ-COMMIT,但是InnoDB默认使用REPEATABLE-READ,并且不会有任何性能损失。
MyISAM
和InnoDB
存储引擎使用的锁:
表级锁和行级锁对比:
InnoDB存储引擎的锁的算法有三种:
当MySQL单表记录过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下:
池化思想在很多的地方都可以见到,比如java线程池
,jdbc连接池
,redis连接池
等。这种设计会初始预设资源,解决的问题就是抵消每次获取资源的消耗,如创建线程的开销,获取远程连接的开销等。除了初始化资源,池化设计还包括如下这些特征:池子的初始化、池子的活跃值、池子的最大值等,这些特征可以直接映射到java线程池和数据库连接池的成员属性中。
数据库连接本质上就是一个socket
连接。数据库服务端还要维护一些缓存和用户权限信息之类的所以占用了一些内存。我们可以把数据库连接池看作是维护数据库连接的缓存,以便将来需要对数据库的请求时可以重用这些连接。为每个用户打开和维护数据库连接,尤其时对动态数据库驱动的网站应用程序的请求,既昂贵又浪费资源。
在连接池中,创建连接后,将其放置在池中,并再次使用它,因此不必建立新的连接。如果使用了所有连接,则会建立一个新连接并将其添加到池中。
JavaGuide面试突击版,百度可得最新版,有删减和小部分修正。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有