数据库:
- 数据库索引的好处:索引是对数据库表中的一个或多个列的值进行排序的结构,这样检索或者查询某条记录的时候就不在是顺序查找,而是使用特定的查找方式进行查找,如通过二分查找或者是hash值来查找,提高查询效率。
- Mysql如何查看执行计划:可以通过explain命令来帮助我们分析sql语句的执行情况,来了解sql如何使用索引,连接查询的执行顺序,查询的数据行数。只需要在查询select关键字之前增加explain这个词即可。
- possible_keys指出mysql能使用哪些索引来优化查询,查询上所涉及的索引都会被列出,但不一定会使用;
- Key查询优化器查询实际使用的索引,如果没有,显示null
- Table 输出数据行所在的表名
- Id是一位数字,表示执行select语句的顺序,id相同执行顺序从上到下,越大先执行。
- Select_type显示对应行是简单还是复杂。不包含子查询或者union(simple)包含子查询:primary
- Mysql执行计划的顺序:id相同从上往下执行,id不同,大的先执行。
- 如何查看mysql中sql执行的快慢:通过profiling命令来查看sql的执行时间。
- 首先先检查profiling的状态(select @@profiling 0代表关闭着分析功能,把他设置为1 set profiling=1,再次查看select @@profiling,这个时候已经是1了)
- 查看sql语句的执行时间(show profiles);
- 查看sql执行耗时的详细信息。Show profile query queryID;
- 使用什么数据库连接池?连接池的工作原理?常用连接池C3PO,proxool与dbcp的区别? https://blog.csdn.net/shuaihj/article/details/14223015
DBCP,C3P0区别:
https://blog.csdn.net/baidu_37107022/article/details/77416852
早期数据库操作:
①装载数据库驱动程序;
②通过jdbc建立数据库连接;
③访问数据库,执行sql语句;
④断开数据库连接。
为了解决资源的频繁分配﹑释放所造成的问题,可以采用数据库连接池技术。
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。
① 编写class 实现DataSource 接口
② 在class构造器一次性创建10个连接,将连接保存LinkedList中
③ 实现getConnection 从 LinkedList中返回一个连接
④ 提供将连接放回连接池中方法
JNDI;java naming directory interface(java命名目录接口),将程序与数据库连接的建立的参数解耦开来。
区别:
1. DBCP没有自动去回收空闲连接池的功能,C3P0有自动回收空闲连接的功能。
2. Dbcp有着比c3p0更高的效率,但是在实际应用中,有出现丢失连接的可能,c3p0的稳定性比较高,它是一个开源的JDBC连接池,实现数据源和JNDI的绑定,目前使用它的开源项目有hibernate和spring。
(关系型数据库)事务的四大特性(ACID) |
原子性(Atomicity)(写的时候要求原子性,读的时候要求一致性) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败 一致性(Consistency) 官网上事务一致性的概念是:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。以转账为例子,A向B转账,假设转账之前这两个用户的钱加起来总共是2000,那么A向B转账之后,不管这两个账户怎么转,A用户的钱和B用户的钱加起来的总额还是2000,这个就是事务的一致性。 隔离性(Isolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。 持久性(Durability) |
隔离级别:
四种隔离级别分别从低到高为:
Read uncommitted:读未提交:什么都不能保证
Read committed:读已提交:可避免脏读
Repeatable read:可重复读:可避免脏读和不可重复读
serializable:串行化:可避免脏读和不可重复读和幻读
事务不考虑隔离性可能会引发的问题:
如果事务不考虑隔离性,可能会引发如下问题:
脏读:一个事务读取了另一个事务还没提交的数据;
不可重复读:一个事务多次读取了表中的同一条数据,读取结果不一样;
虚读(幻读):一个事务读取了另一个事务插入的数据,导致前后读取结果不一样。
简单的说:哈希索引就是采用一定的哈希算法,将键值换算成新的哈希值,检索的时候就不用跟B+树一样,从跟节点到叶子节点逐级查找,只需要一次哈希算法就能定位到对应的数据,速度非常快。
B+树适合大多数场景,例如:范围查询,排序,分组
哈希索引适合主要以等值查询为主,没有范围查询,没有排序的时候。