目录
2 为什么要使用索引?有什么优缺点,怎么使用,什么情况下使用?
前言:
一直纠结的几个问题,查了下资料 总结下。
之前感觉数据库的连接挺简单的啊,在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 为什么使用数据库连接池
2 https://blog.csdn.net/usstmiracle/article/details/81902938 索引概念参考
3 https://blog.csdn.net/canot/article/details/80217503 索引实际分析参考
4 https://blog.csdn.net/lichundongv5/article/details/79611994
为什么要用索引,索引怎么使用,怎么查看索引被调用了?