几点思考-为什么使用索引,数据库连接池种种

目录

前言:

1 为什么要使用数据库连接池 、好处是什么

2 为什么要使用索引?有什么优缺点,怎么使用,什么情况下使用?

        2.1 为什么要使用索引?如何增加查询效率?

2 .2 索引的使用

2.3 索引有什么副作用吗?

2.4 数据库建立索引常用的规则如下: 


 

前言:

一直纠结的几个问题,查了下资料 总结下。

之前感觉数据库的连接挺简单的啊,在spring里简单配置 连接的URL 用户名和密码就OK了,为啥很多项目都要单独起个配置连接池的配置文件,很多繁杂的选项,感觉没那个必要啊,没有很直观的感受,也懒的去查个所以然,关注点不在上面,今天闲暇就把它给弄明白了。

索引,也是哪个面试官都喜欢的问的结构,包括其数据结构 B+树, 在myIsam与innodb中的不同什么的,自己项目里平时很少用索引去查,所以没有确切的感受,今天也顺便向广大网友求个证。很多道理大家都懂,不用熟练 用明白 是无法牢牢记住的。

索引的添加方法也比较简单  加之后也是隐试的,就是在我们在输入where查询的时候,内部全走索引扫描而不是全表,使用者的感知就是搜索时间变短了 没有明显的其他感知 可以用EXPALAIN + SQL 语句去对比索引添加前后的实际数值,所以我们需要知道其原理 怎么加 加给哪个字段 加什么索引就比较重要了

1 为什么要使用数据库连接池 、好处是什么

对于一个简单的数据库应用,由于对于数据库的访问不是很频繁。这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销。但是对于一个复杂的数据库应用,情况就完全不同了。频繁的建立、关闭连接,会极大的减低系统的性能,因为对于连接的使用成了系统性能的瓶颈。

连接复用。通过建立一个数据库连接池以及一套连接使用管理策略,使得一个数据库连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。

对于共享资源,有一个很著名的设计模式:资源池。该模式正是为了解决资源频繁分配、释放所造成的问题的。把该模式应用到数据库连接管理领域,就是建立一个数据库连接池,提供一套高效的连接分配、使用策略,最终目标是实现连接的高效、安全的复用。

数据库连接池技术带来的优势

1. 资源重用

由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。

2. 更快的系统响应速度

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

3. 新的资源分配手段

对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术,几年钱也许还是个新鲜话题,对于目前的业务系统而言,如果设计中还没有考虑到连接池的应用,那么…….快在设计文档中加上这部分的内容吧。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。

4. 统一的连接管理,避免数据库连接泄漏

在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。一个最小化的数据库连接池实现

本人也没有通过JVM做过一些对比 没有踩过坑 今日比较好奇 

2为什么要使用索引?有什么优缺点,怎么使用,什么情况下使用?

  2.1 为什么要使用索引?如何增加查询效率?

    索引向来是面试必争之地,接触开发也有一两年时间了,DB的CRUD做了不少,索引见了不少,索引的原理与数据结构看了不好,一直没有串起来,没有直接添加过索引,所以也是不知其所以然,今天来彻底解决疑惑

    其实在互联网工作,数据库沉淀个几年 少则都有几百万条数据,一条查询语句等个几分钟岂不很影响效率,很难受,几亿条呢,等十几分钟?

    所以对唯一主键加索引 采用最快的树形结构查找会大大增加查询效率

           索引就是通过事先排好序,从而在查找时可以应用二分查找等高效率的算法。
一般的顺序查找,复杂度为O(n),而二分查找复杂度为O(log2n)。当n很大时,二者的效率相差及其悬殊。

举个例子:
表中有一百万条数据,需要在其中寻找一条特定id的数据。如果顺序查找,平均需要查找50万条数据。而用二分法,至多不超过20次就能找到。二者的效率差了2.5万倍!

在一个或者一些字段需要频繁用作查询条件,并且表数据较多的时候,创建索引会明显提高查询速度,因为可由全表扫描改成索引扫描。

(无索引时全表扫描也就是要逐条扫描全部记录,直到找完符合条件的,索引扫描可以直接定位)

不管数据表有无索引,首先在SGA的数据缓冲区中查找所需要的数据,如果数据缓冲区中没有需要的数据时,服务器进程才去读磁盘。
1、无索引,直接去读表数据存放的磁盘块,读到数据缓冲区中再查找需要的数据。
2、有索引,先读入索引表,通过索引表直接找到所需数据的物理地址,并把数据读入数据缓冲区中。

 

 

2 .2 索引的使用

索引是数据库本身在执行的时候调用的,而不是我们去程序中使用

 在查询sql中where条件中使用索引列

执行计划中可以体现用到了的索引有那些,在Navicat for sql中查询执行计划是点‘解释’查看possible_keys列用到的索引,pl/sql可以直接查看

2.3 索引有什么副作用吗?

(1)索引是有大量数据的时候才建立的,没有大量数据反而会浪费时间,因为索引是使用二叉树建立.

(2)当一个系统查询比较频繁,而新建,修改等操作比较少时,可以创建索引,这样查询的速度会比以前快很多,同时也带来弊端,就是新建或修改等操作时,比没有索引或没有建立覆盖索引时的要慢。

(3)索引并不是越多越好,太多索引会占用很多的索引表空间,甚至比存储一条记录更多。
对于需要频繁新增记录的表,最好不要创建索引,没有索引的表,执行insert、append都很快,有了索引以后,会多一个维护索引的操作,一些大表可能导致insert 速度非常慢。

 

2.4 数据库建立索引常用的规则如下: 


1、表的主键、外键必须有索引; 
2、数据量超过300的表应该有索引; 
3、经常与其他表进行连接的表,在连接字段上应该建立索引; 
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; 
5、索引应该建在选择性高的字段上; 
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: 
  A、正确选择复合索引中的主列字段,一般是选择性较好的字段; 
  B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否 
     极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引; 
  C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; 
  D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段; 
  E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引; 
8、频繁进行数据操作的表,不要建立太多的索引; 
9、删除无用的索引,避免对执行计划造成负面影响; 

参考:

1. https://blog.csdn.net/dly1580854879/article/details/73088884  为什么使用数据库连接池

https://blog.csdn.net/usstmiracle/article/details/81902938  索引概念参考

https://blog.csdn.net/canot/article/details/80217503 索引实际分析参考

https://blog.csdn.net/lichundongv5/article/details/79611994 

为什么要用索引,索引怎么使用,怎么查看索引被调用了?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值