数据库专题(有关索引引擎/数据库连接池的问题)

一,mysql 中 MyIsam 与 InnoDB 的区别

  • 1.事务处理上方面
    MyISAM 强调的是性能,查询的速度比 InnoDB 类型更快,但是不提供事务支持。 InnoDB 提供事务支持事务。
  • 2.外键
    MyISAM 不支持外键,InnoDB 支持外键。
  • 3.锁
    MyISAM 只支持表级锁,InnoDB 支持行级锁和表级锁,默认是行级锁,行锁大幅 度提高了多用户并发操作的性能。innodb 比较适合于插入和更新操作比较多的情况, 而 myisam 则适合用于频繁查询的情况。另外,InnoDB 表的行锁也不是绝对的,如果 在执行一个 SQL 语句时,MySQL 不能确定要扫描的范围,InnoDB 表同样会锁全表。
  • 4.全文索引
    MyISAM 支持全文索引, InnoDB 不支持全文索引。innodb 从 mysql5.6 版本开始提 供对全文索引的支持。
  • 5.表主键
    MyISAM:允许没有主键的表存在。
    InnoDB:如果没有设定主键,就会自动生成一个 6 字节的主键(用户不可见)。
  • 6.表的具体行数
    MyISAM:select count(*) from table,MyISAM 只要简单的读出保存好的行数。因为 MyISAM 内置了一个计数器,count(*)时它直接从计数器中读。
    InnoDB:不保存表的具体行数,也就是说,执行 select count(*) from table 时,InnoDB 要扫描一遍整个表来计算有多少行。

二. 一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删 除了第 15,16,17 条记录,再把 Mysql 重启,再 insert 一条记录, 这条记录的 ID 是 18 还是 15 ?

如果表的类型是 MyISAM,那么是 18。
因为 MyISAM 表会把自增主键的最大 ID 记录到数据文件里,重启 MySQL 自增主键的最大 ID 也不会丢失。
如果表的类型是 InnoDB,那么是 15。
InnoDB 表只是把自增主键的最大 ID 记录到内存中,所以重启数据 库会导致最大 ID 丢失。

其他问题

一,数据库在进行水平分表之后,sql 分页查询该怎么进行?分表之后想让一个 id 多个表 是自增的,效率实现 。数据库中的分页查询语句怎么

1.用 union all 合并几个分表的结果集,之后进行分页查询。
2.如假定共 3 个分表,记录数分别为 90,120,80 ,总记录数为 290 设分页是每页显示 40 条,则
第 1 页 表一的 1 到 40
第 2 页 表一的 41 到 80
第 3 页 表一的 81 到 90 + 表二的 1 到 30
第 4 页 表二的 31 到 70
第 5 页 表二的 71 到 110
第 6 页 表二的 111 到 120 + 表三的 1 到 30 …
当我们对 MySQL 进行分表操作后,将不能依赖 MySQL 的自动增量来产生唯一 ID 了, 因为数据已经分散到多个表中。
使用队列服务,如 redis、memcacheq 等,将一定量的 ID 预分配在一个队列里,每次 插入操作,先从队列中获取一个 ID,若插入失败的话,将该 ID 再次添加到队列中,同时 监控队列数量,当小于阀值时,自动向队列中添加元素。

二,关系型数据库和非关系型数据库的区别

非关系型数据库的优势:

  1. 性能
    NOSQL 是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经 过 SQL 层的解析,所以性能非常高。
  2. 可扩展性
    同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。

关系型数据库的优势:

  1. 复杂查询
    可以用 SQL 语句方便的在一个表以及多个表之间做非常复杂的数据查询。
  2. 事务支持
    使得对于安全性能很高的数据访问要求得以实现。

三.数据库连接池的原理?连接池使用什么数据结构实现?实现连接池?

早期我们怎么进行数据库操作:
1.原理:一般来说,java 应用程序访问数据库的过程是:
①加载数据库驱动程序; ②通过 jdbc 建立数据库连接; ③访问数据库,执行 sql 语句; ④断开数据库连接。
2.代码
数据库专题(有关索引引擎/数据库连接池的问题)
3.分析

首先,每一次 web 请求都要建立一次数据库连接。建立连接是一个费时的活动, 每次都得花费 0.05s~1s 的时间,而且系统还要分配内存资源。这个时间对于一次或 几次数据库操作,或许感觉不出系统有多大的开销。可是对于现在的 web 应用,尤其 是大型电子商务网站,同时有几百人甚至几千人在线是很正常的事。在这种情况下,频 繁的进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重的 甚至会造成服务器的崩溃。

其次,对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而 未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,这种 开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多, 也可能导致内存泄漏,服务器崩溃。

通过上面的分析,我们可以看出来,“数据库连接”是一种稀缺的资源,为了保障 网站的正常使用,应该对其进行妥善管理。其实我们查询完数据库后,如果不关闭连接, 而是暂时存放起来,当别人使用时,把这个连接给他们使用。就避免了一次建立数据库 连接和断开的操作时间消耗。

为解决上述问题,可以采用数据库连接池技术。 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入 一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕 之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽地与数据库连接。 更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为 系统开发﹑测试及性能调整提供依据。

连接池代码:
数据库专题(有关索引引擎/数据库连接池的问题)
数据库专题(有关索引引擎/数据库连接池的问题)

使用连接池重构用户查询函数
数据库专题(有关索引引擎/数据库连接池的问题)
数据库专题(有关索引引擎/数据库连接池的问题)
连接池的工作原理:
连接池的核心思想是连接的复用,通过建立一个数据库连接池以及一套连接使用、分 配和管理策略,使得该连接池中的连接可以得到高效,安全的复用,避免了数据库连接频 繁建立和关闭的开销。
连接池的工作原理主要由三部分组成,分别为连接池的建立,连接池中连接的使用管理,连接池的关闭。

1.连接池的建立
一般在系统初始化时,连接池会根据系统配置建立,并在池中 建立几个连接对象,以便使用时能从连接池中获取。java 中提供了很多容器类,可以方便 的构建连接池,例如 Vector(线程安全类),linkedlist 等。

2.连接池的管理
连接池管理策略是连接池机制的核心,连接池内连接的分配和 释放对系统的性能有很大的影响。其策略是:
当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接, 则将连接分配给客户使用并作相应处理(即标记该连接为正在使用,引用计数加 1);如 果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没有达到最大 连接数,如果没达到就重新创建一个连接给请求的客户;如果达到,就按设定的最大等待 时间进行等待,如果超出最大等待时间,则抛出异常给客户。

当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过了 就从连接池中删除该连接,并判断当前连接池内总的连接数是否小于最小连接数,若小于 就将连接池充满;如果没超过就将该连接标记为开放状态,可供再次复用。

3.连接池关闭

当应用程序退出时,关闭连接池中所有的链接,释放连接池相 关资源,该过程正好与创建相反。

连接池的主要优点:

1.减少连接的创建时间
连接池中的连接是已准备好的,可以重复使用的,获取后可以直 接访问数据库,因此减少了连接创建的次数和时间。

2.更快的系统响应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接 置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有 可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。

3.统一的连接管理
如果不使用连接池,每次访问数据库都需要创建一个连接,这样系统的稳定性受系统的连接需求影响很大,很容易产生资源浪费和高负载异常。连接池能够使 性能最大化,将资源利用控制在一定的水平之下。连接池能控制池中的链接数量,增强了 系统在大量用户应用时的稳定性。

四,关系的五种基本运算

1.并
R,S 具有相同的关系模式(元素相同,结构相同),记为 R U S,返回由 R 或者 S 元组 构成的集合组成
2.差
R,S 具有相同的关系模式(元素相同,结构相同),记为 R-S,由属于 R 但不属于 S 的 元组组成
3.广义笛卡尔积
R×S 由 n 目和 m 目的关系 R,S 组成一个(n+m)列的元组集合,若 R 有 K1 个元组,S 有 K2 个元组,则 R×S 有 K1*K2 个元 组。
4.投影
从关系的垂直方向开始运算,选择关系中的若干列组成新的列。
5.选择
从关系的水平方向进行运算,选择满足给定条件的元组组成新的关系。