数据库
数据库相关技术分享
JustinNeil
年少是你未醒的梦话,风华是燃尽的彼岸花
展开
-
一条SQL语句执行很慢的原因有哪些?
一条SQL语句执行和很慢的原因有哪些?分类讨论偶尔很慢的情况数据库在刷新脏页拿不到锁一直很慢的情况没用上索引字段没有索引字段有索引,索引失效数据库自己选错索引了总结分类讨论一条 SQL 语句执行的很慢,那是每次执行都很慢呢?还是大多数情况下是正常的,偶尔出现很慢呢?所以我觉得,我们还得分以下两种情况来讨论。1、大多数情况是正常的,只是偶尔会出现很慢的情况。2、在数据量不变的情况下,这条SQ...原创 2019-08-05 14:58:14 · 291 阅读 · 0 评论 -
MySQL高性能优化规范建议
MySQL高性能优化规范建议数据库命名规范数据库基本设计规范数据库字段设计规范索引设计规范数据库SQL开发规范数据库操作行为规范数据库命名规范所有数据库对象名称必须使用小写字母并用下划线分割所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)数据库对象的命名要能做到见名知意,并且最好不要超过 32 个字符临时库表必须以 tmp_为前缀...原创 2019-08-05 11:34:47 · 213 阅读 · 0 评论 -
SQL语句执行流程
SQL语句执行流程前言查询语句更新语句总结前言在上一篇文章中,我们介绍了MySQL的基础架构组成,本文来给大家介绍SQL语句在MySQL中是如何执行的。其实我们的 sql 可以分为两种,一种是查询,一种是更新(增加,更新,删除)。我们先分析下查询语句查询语句来看一个例子select * from tb_student A where A.age='18' and A.name=' 张...原创 2019-08-05 09:55:50 · 247 阅读 · 0 评论 -
MySQL基础架构分析
MySQL基础架构分析前言MySQL基本架构图Server层连接器查询缓存分析器优化器执行器存储引擎层前言本文将向大家介绍MySQL中的各种组件以及它们的功能,首先来看一张简要的架构图MySQL基本架构图在上图中我们可以看到MySQL的各部分组件主要分为两个大部分,Server层和存储引擎层Server层Server层主要包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎...原创 2019-08-05 09:24:59 · 537 阅读 · 0 评论 -
数据库水平拆分解决方案
水平拆分解决方案客户端架构客户端架构的优点客户端架构的缺点代理架构代理架构的优点代理架构的缺点现有方案对比由于水平拆分牵涉的逻辑比较复杂,当前也有了不少比较成熟的解决方案。这些方案分为两大类:客户端架构和代理架构。客户端架构客户端架构通过修改数据访问层,如JDBC、Data Source、MyBatis,通过配置来管理多个数据源,直连数据库,并在模块内完成数据的分片整合,一般以jar包的方式...原创 2019-08-05 08:58:42 · 683 阅读 · 0 评论 -
水平拆分
水平拆分概述水平分库示例水平拆分的优点水平拆分的缺点分片原则概述水平拆分指的是通过某种策略将数据分片存储,包含库内分表和分库两种,每片数据会分散到不同的MySQL表或库,达到分布式的效果,能够支持非常大的数据量。前面的文章中提到的表分区本质上也是一种特殊的库内分表库内分表,仅仅解决了单一表数据过大的问题,由于没有把表的数据分布到不同的机器上,因此对于减轻MySQL服务器的压力来说,并没有太大...原创 2019-08-05 08:35:54 · 1496 阅读 · 0 评论 -
垂直拆分
垂直分库概念示例垂直拆分的优点垂直拆分的缺点概念垂直分库是根据数据库里面的数据表的相关性进行拆分,比如:一个数据库里面既存在用户数据,又存在订单数据,那么垂直拆分可以把用户数据放到用户库、把订单数据放到订单库。垂直分表是对数据表进行垂直拆分的一种方式,常见的是把一个多字段的大表按常用字段和非常用字段进行拆分,每个表里面的数据记录数一般情况下是相同的,只是字段不一样,使用主键关联示例比如原始...原创 2019-08-04 19:33:18 · 2180 阅读 · 0 评论 -
表分区
表分区简介分区的好处分区的限制和缺点分区的类型分区适合的场景简介MySQL在5.1版引入的分区是一种简单的水平拆分,用户需要在建表的时候加上分区参数,对应用是透明的无需修改代码对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成,实现分区的代码实际上是通过对一组底层表的对象封装,但对SQL层来说是一个完全封装底层的黑盒子。MySQL实现分区的方式也意味着索引也是按照分区的子表定义...原创 2019-08-04 19:19:46 · 2076 阅读 · 0 评论 -
MySQL单表优化
MySQL单表优化单表优化概述字段优化索引优化SQL语句优化引擎优化系统调优参数升级硬件单表优化概述当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以在以下几个方面进行优化除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的。而事实上很多时候MySQL单表的...原创 2019-08-04 19:01:56 · 2264 阅读 · 0 评论 -
MyISAM与InnoDB对比
MyISAM对比InnoDB简介区别表锁差异数据库文件差异索引差异简介1、MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。不是事务安全的,而且不支持外键,如果执行大量的查询,插入,MyISAM比较适合。2、InnoDB:支持事务安全的引擎,支持外键...原创 2019-08-04 17:13:55 · 160 阅读 · 0 评论 -
B+Tree
B+Tree定义B+树是B树的变体,也是一种多路搜索树:其定义基本与B树同,除了:1.非叶子结点的子树指针与关键字个数相同;2.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B树是开区间);3.为所有叶子结点增加一个链指针;4.所有关键字都在叶子结点出现;B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B树可以在非叶子结点命中),...原创 2019-07-30 09:40:42 · 130 阅读 · 0 评论 -
Hash索引与BitMap索引
Hash索引概念hash index是基于哈希表实现的,只有精确匹配索引所有列的查询才会生效。对于每一行数据,存储引擎都会对所有的索引列计算一个hash code,并将的有的hash code存储在索引中,同时在哈希表中保存指向每个数据行的指针。在MySQL中,只有Memory引擎显示支持哈希索引,也是默认索引类型。比如create table test_hash(fname varc...原创 2019-07-30 10:42:49 · 667 阅读 · 0 评论 -
索引
索引概念在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这...原创 2019-07-30 08:38:17 · 171 阅读 · 0 评论 -
密集索引和稀疏索引的区别
密集索引密集索引文件中每一个搜索码值都对应一个索引值,就是叶子节点保存的不只是键值,还保存了位于同一行记录里的其他列的信息,由于密集索引决定了表的物理排列顺序,一个表只有一个物理排列顺序,所以一个表只能创建一个密集索引稀疏索引稀疏索引文件只为索引码的某些值建立索引项, 比如 InnoDB的其他索引只存了键位信息和主键, MyISAM的所有索引都是InnoDB如果一个主键被定义了,那么这...原创 2019-07-30 08:08:31 · 896 阅读 · 0 评论 -
常见的SQL优化面试题
1.在表中建立索引,优先考虑 where group by 使用到的字段2.查询时尽量避免使用select * ,只查询需要用到的字段3.避免在where子句中使用关键字两边都是%的模糊查询,尽量在关键字后使用模糊查询4.尽量避免在where子句中使用IN 和NOT IN优化:能使用between就不用in在子查询中使用exists 子句5.尽量避免使用or,优化:可以用union代替...原创 2019-07-22 19:56:54 · 6564 阅读 · 0 评论 -
数据库连接池
对于一个简单的项目应用,由于对于数据库的访问不是很频繁。这时可以简单的在需要访问数据库时创建连接,用完后就关闭,也不会造成很大的性能能开销。但对于一个复杂的数据库应用,就不同了,频繁的建立,关闭连接,会极大地消耗系统的性能,因此对连接的使用造成了系统性能的瓶颈。此时可以在程序启动时创建一定数量的连接保存到容器里面,之后要取得连接直接在容器中取,不需要使用时再创建,使用完就回收到容器里,这样的容器...原创 2019-05-30 17:34:12 · 105 阅读 · 0 评论 -
数据访问对象层Dao的设计
在基于MVC模式的框架中,Dao层处理的是访问数据库操作,本文以访问Emp表为例首先在bean包下创建与数据库中emp表对应的实体类Emppublic class Emp implements Serializable{ private static final long serialVersionUID = 456852456852L; @Column(values = "empn...原创 2019-05-29 15:36:23 · 563 阅读 · 0 评论 -
耦合
耦合就是程序之间的依赖程度,确切一点就是上层代码对下层代码的依赖程度,依赖程度越高说明耦合越高,我们的目标是开发松耦合的代码,降低耦合的方法有很多种,使用接口就是解耦合的方案之一同样实现数据库的CRUD,若不使用接口,当操作的对象或使用的的数据库改变时,需要大量修改客户端的代码,若定义同样的标准,则可以减少依赖程度,这样的标准就是接口定义所有数据库操作的公共父接口public interfa...原创 2019-05-28 13:15:24 · 466 阅读 · 0 评论 -
DBUtil之查询数据
/** * 根据条件查询单个数据 * @param con * @param sql * @param cls * @param param * @return * @throws Exception */ public static<T> T selectOne(Connection con,String sql,Class<T> cls...原创 2019-05-27 17:37:44 · 845 阅读 · 0 评论 -
DBUtil之删除数据
/** * 实现满足条件的删除单条数据 * @param con * @param sql * @param param * @return */ public static int remove(Connection con,String sql,Object... param) throws Exception{ ps = con.prepareStatemen...原创 2019-05-27 13:50:36 · 945 阅读 · 0 评论 -
DBUtil之编辑数据
重载两个编辑数据的方法分别根据实体类对象和字段值的可变参数更新数据库/** * 根据传入的实体类对象更新数据库 * @param con 数据库连接对象 * @param sql SQL语句 * @param t 数据库表对应的实体类对象 * @return 更新的行数 * @throws Exception */ public static<T> in...原创 2019-05-27 09:40:37 · 136 阅读 · 0 评论 -
DBUtil之添加数据
将操作数据库的相关方法封装成一个数据库工具类,实现基本的CRUD,本文主要利用反射,注解,泛型等实现添加数据功能首先定义DBUtil工具类public class DBUtil { private static PreparedStatement ps = null; private static ResultSet rs=null;}用于标记实体类中字段的注解@Target(El...原创 2019-05-27 08:30:24 · 1224 阅读 · 0 评论 -
JDBC实现数据的删除
Demo:根据编号删除一条数据 /** * 根据编号删除一条数据 */ public static int deleteEmpByEmpno(int empno){ //获取数据库连接 con = getConnection(); //准备SQL语句 String sql ="DELETE FROM emp WHERE empno=?"; try { //获取...原创 2019-05-26 09:44:34 · 3391 阅读 · 0 评论 -
JDBC事务处理
为了防止出现转账时一方款项扣除了而另一方款项没有增加的问题,在实现转账功能时需要加入事务处理,在所有操作前取消自动提交,所有数据库操作完成后手动提交,保证了事务的原子性。Demo:转账/** * 转账 * * @param username1 * 转账人 * @param username2 * 收款人 * @param...原创 2019-05-25 19:05:49 · 153 阅读 · 0 评论 -
封装数据库连接工具类
在实际项目中,通常不会在主程序中进行数据库操作,通常将所有数据库相关操作封装到一个数据库工具类中,放在utils包下public class JDBCUtils { public static final String DRIVER = "com.mysql.jdbc.Driver"; public static final String URL = "jdbc:mysql://localh...原创 2019-05-25 17:20:59 · 805 阅读 · 0 评论 -
JDBC添加数据
使用DrivergetConnect()取得的连接对象是Connection类型,如果要对数据库中的数据进行操作,我们还需要该对象取得另一个对象来发送SQL语句,要取得这个发送SQL语句的对象我们需要用到Connnetion中的这些方法:void close();//关闭数据库连接,使用完数据库连接之后必须关闭boolean isClose();//判断该连接是否关闭Statement cr...原创 2019-05-25 13:58:31 · 13082 阅读 · 1 评论 -
JDBC
JDBC(Java Database Connective) Java数据库连接工具,使用对应的类库连接Java程序与数据库执行SQL语句MySQL驱动包下载地址:www.mvnrepository.com在上面下载mysql-connector-java这个包,建议下载较稳定的版本在项目中使用Build-path导入包使用java连接MySQL...原创 2019-05-25 11:04:32 · 114 阅读 · 0 评论 -
数据库设计的范式
数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。第一范式(1NF)确保数据库表中每一列的原子性,即每一列都是不可拆分的。比如数据库中的地址属性,如果系统中经常要求访问城市,则应该...原创 2019-05-24 16:51:55 · 177 阅读 · 0 评论 -
MySQL
MySQL是比ORACLE更小的一个数据库,比ORACLE更轻便,而且是开源的MySQL的历史简介MySQL最早来源于MySQL AB公司前身的ISAM于mSQL项目,于1996年发布的第一个版本MySQL 1.0,当时只支持SQL特性,没有事务支持。2003年12月,MySQL 5.0版本发布,提供了视图、存储过程等功能2008年一月,Sun公司以10亿美金收购了MySQL AB公司2...原创 2019-05-24 13:56:22 · 130 阅读 · 0 评论 -
触发器
触发器在数据库中以独立的对象存储,它与存储过程和函数不同的是,存储过程和函数需要用户显式调用才能执行,而触发器是通过事件来启动运行,即当某个事件发生时自动的隐式运行,而且触发器不能接收参数。ORACLE中的事件指的是对表的INSERT,UPDATE,DELETE或对视图进行类似的操作,ORACLE 把触发器的功能扩展到了触发ORACLE,例如数据库的启动与关闭。所以触发器常用来完成由数据库完整...原创 2019-05-24 11:16:17 · 454 阅读 · 0 评论 -
存储过程
存储过程指的是经过编译后存储在数据库中,用户通过指定存储过程的名称及其参数来调用,存储过程中可以包含逻辑控制语句和数据操纵语句Demo:创建过程CREATE OR REPLACE PROCEDURE hello_say AS BEGIN DBMS_OUTPUT.put_line('hello_world'); END; /Demo:调用过程BEGIN hello_say...原创 2019-05-24 09:04:10 · 131 阅读 · 0 评论 -
PL/SQL中的程序控制
Demo:定义常量常量使用CONSTANT修饰,必须在定义时赋初值,不能改变常量的值DECLARE v_num CONSTANT NUMBER:=100; BEGIN DBMS_OUTPUT.put_line('v_num='||v_num); END;DECLARE v_num CONSTANT NUMBER:=100; BEGIN v_num:=200; DBM...原创 2019-05-23 19:16:42 · 235 阅读 · 0 评论 -
PL/SQL
PL/SQL也是一种程序语言,叫做过程化/SQL语言。PL/SQL是ORACLE对SQL语言的扩展,在普通SQL语句中加入了编程语言的特点。PL/SQL把数据操作和普通的SQL语句组织PL/SQL代码的过程性单元中,实现复杂的功能或者计算,PL/SQL只有ORACLE数据库才有。Demo: 输出hello_worldSET SERVEROUTPUT ON; BEGIN DBMS_OUTP...原创 2019-05-23 18:48:50 · 150 阅读 · 0 评论 -
数据库索引
索引是提高查询速度的一种手段,有很多种。切换管理员用户CONN SYS\CHANGE_ON_INSTALL AS SYSDBA;打开跟踪器SET AUTOTRACE ON;执行无索引状态的查询SELECT * FROM SCOTT.emp WHERE sal>2500;TABLE ACCESS FULL 代表查询数据时使用的是全表扫描使用索引查询创建索引基本语法...原创 2019-05-23 08:20:21 · 119 阅读 · 0 评论 -
约束的级联操作
级联操作是存在与主表和从表关系中,当操作了主表的数据,要求从表的数据也同步更新或删除,这样的操作叫做级联操作,级联操作包括:级联删除,级联更新,级联查询(使用程序实现)级联删除若主表中数据被子表引用了,则要删除主表数据时,要么先删除子表中对应数据,要么使用级联删除级联删除的定义使用 ON DELETE CASCADE关键字CREATE TABLE employee(eno number(...原创 2019-05-22 19:39:38 · 251 阅读 · 0 评论 -
外键约束
所谓的外键约束就是数据库中一张表的某个字段的数据来源依赖于另一张表的某个字段,例如在emp表中的部门编号deptno,这个字段的字段值应该在dept表中的deptno字段中存在,否则就不满足外键约束CREATE TABLE employee( eno number(4), ename varchar2(12), sal number(8,2), hiredate DATE, deptn...原创 2019-05-22 12:44:35 · 409 阅读 · 0 评论 -
自定义约束名
除了添加数据库提供的约束条件外,我们还可以自定义约束自定义约束使用 CONSTRAINT关键字实现语法格式:CONSTRAINT 约束名 约束类型(添加约束的字段名)CREATE TABLE employee( eno number(4), ename varchar2(12), sal number(8,2), hiredate DATE, CONSTRAINT pk_eno ...原创 2019-05-22 09:46:47 · 3085 阅读 · 0 评论 -
数据表的创建
除了使用数据库本身提供的数据表外,我们还可以通过数据库提供的关键字CREATE 创建数据表格式如下:CREATE TABLE 表名(字段名 字段格式,字段名 字段格式,字段名 字段格式,字段名 字段格式,…);CREATE TABLE employee( eno number(4), ename varchar2(12), sal number(8,2), hiredat...原创 2019-05-22 08:30:21 · 918 阅读 · 0 评论 -
序列的使用
一般情况下每张数据表都会有一个字段作为数据的唯一区分标志,而且该字段的数据不能重复,这个字段叫做数据表的主键,需要手动指定主键值就很麻烦,可以使用ORACLE的序列实现主键的自增长。序列的基本语法:--删除序列DROP SEQUENCE 序列名;--创建序列CREATE SEQUENCE 序列名;--使用序列INSERT INTO 表名(主键字段名1,字段名2,字段名3...) VA...原创 2019-05-21 19:25:34 · 548 阅读 · 0 评论 -
PLSQL数据库连接工具常见问题解决
第一种:监听程序无法识别连接描述中的服务找到文件“\Oracle\Product\10.2.0\db_1\network\ADMIN\listener.ora”加入下面内容SID_LIST_LISTENER= (SID_LIST= (SID_DESC= (SID_NAME=PLSExtProc) (ORACLE_HOME = d:\oracle\product\10.2.0\...原创 2019-05-21 17:09:06 · 606 阅读 · 0 评论