本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB

Mysql驱动:com.mysql.jdbc.Driver

MysqlURL:jdbc:mysql://localhost:3306/数据库名称

Oracle驱动:oracle.jdbc.OracleDriver

OracleURLjdbc:oracle:thin:@localhost:1521:SID

jdbc:oracle:thin:@//localhost:1521:SERVICENAME

查看数据库当前存储引擎:show variables like '%storage_engine%';

            show variables like '%storage_engine%';

事务:事务可以看做是由对数据库的若干操作组成的一个单元,这些操作要么都完成,要么都取消,从而保证数据满足的一致性和完整性

在没有commit事务前,所有增删改查操作,数据库的数据没有真正发生变化

一、事务的基本要素(ACID

  1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

   2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。

   3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

   4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

二、事务的并发问题

  1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

  2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。

  3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

  小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

三、MySQL事务隔离级别

事务隔离级别

脏读

不可重复读

幻读

读未提交(read-uncommitted)

不可重复读(read-committed)

可重复读(repeatable-read)

串行化(serializable)

MYSQL的默认隔离级别是repeatable-read

Oracle的默认隔离级别时read-committed

三大范式:

1,第一大范式,列不可分,确保列的原子性 (如,中国北京需要拆分,)

2,第二大范式,确保表中的每列都和主键相关,也就是说每张表只能描述一件事情

3,第三大范式,需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关比如:现在有一张订单表,订单表里可以有用户的id(因为这是外键),但你不能在这个订单表里有用户年龄或用户电话字段,因为这2个字段依赖用户id,并不依赖订单表的主键id,2345

1.建索引时应该注意什么?

答:索引应该加在唯一、不为空、经常被查询的字段。尽量不要建在一些复杂字段,一个表索引不要超过6个,因为索引不是越多越好,加索引虽然可以加快查询速度,但会减慢增删改速度,因为你每次增删改,数据库都会自动更新索引(消耗大量的IO),

字段内容重复多的不建议加索引,原因如下:当检索到这类数据的时候,要获取很多索引数据,和很多的行地址要获取很多的索引数据, 和很多的 行地址, 然后再 根据行地址,去检索行的信息.

2.什么时候用索引,

答:加索引的目的是为了加快查询速度,如有一个sql语句,select id from t where id=10000,这样查找会很慢,可以在id这一列加一个索引,因为索引的底层是基于某种算法,可以大大加快查找速度,

3.为什么重复多的字段不适合建索引

如果有很多重复值的列,建在索引上面.

那么当检索到这类数据的时候.

要获取很多的索引数据, 和很多的 行地址, 然后再 根据行地址,去检索行的信息.,不但不会加快查询速度,反而会影响效率

sql优化

1.’对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

2.select后面尽量避免使用*, 用*会进行全表扫描,要查什么自己加对应的字段即可

3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如(就是说不要使用有null值的字段作为查询)

select id from t where num is null

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from t where num=0

4.in 和 not in 也要慎用,否则会导致全表扫描,如:

select id from t where num in(1,2,3)

对于连续的数值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3

5.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:

select id from t where num/2=100

应改为:

select id from t where num=100*2

6.索引并不是越多越好,索引固然可以提高相应select效率,但会减慢插入和修改速度,这是因为索引是写入到磁盘中去的,一张表的索引最好不要超过6个

 

SQL优化:尽量使用where 字句,先过滤后再分组,如下

求部门编号为10的平均工资:这里涉及SQL优化

select deptno,avg(sal) from emp where deptno=10 group by deptno;

反三大范式(应用场景):

例:有一张货物表,货物表里有单价和数量,但没有总金额,那应不应该加一个总金额字段呢?按照三大范式规则,不能加,但是在实际开发中,应该把总金额放入列中,为什么?

a. 这里使用了反三范式,为什么要使用反三范式?提高查询速度

b. 体现在分布计算,当添加货物时,必须先计算总金额才能加入到了货物表中(总金额的结果在插入时得到的)。查询时无需计算就能得到结果。速度提高百倍。

c. 缺点:出现数据不一致情况。

d.总结:通过空间换效率。

数据库一对一,一对多,多对多关系如何处理,如何体现?

一对一:如学生表对学生档案表

一对多:在多的表建立外键

多对多:建立第三方的表,该表必须关联2表的主键。

拆分关系。增加一个表。使之符合范式。

比如做学生选课系统。多个学生选多门课。这是多对多关系。

这样可以写成三个表。

分别为。学生表(学号,姓名)

课程表(课程号,课程名)

选课表(学号,课程号)

通过选课表,将学生和课程联系起来了。

SQL的执行顺序?

1. FROM

2. WHERE

3. GROUP BY

4. HAVING

5. SELECT

6. DISTINCT

7. UNION

8. ORDER BY

数据库索引什么时候会失效?

  1. 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

  注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

  2.对于多列索引,不是使用的第一部分,则不会使用索引

  3.like查询是以%开头(以%结尾是可以的)

  4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

mysql中常用的三种插入数据的语句

1.insert into表示插入数据,数据库会检查主键(PrimaryKey),如果出现重复会报错;

2.replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引的话,如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样;

3.insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据;

MySql综合知识汇总的更多相关文章

  1. mysql基础知识语法汇总整理(二)

    mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...

  2. MySql面试题、知识汇总、牛客网SQL专题练习

    点击名字直接跳转到链接: Linux运维必会的100道MySql面试题之(一) Linux运维必会的100道MySql面试题之(二) Linux运维必会的100道MySql面试题之(三) Linux运 ...

  3. mysql基础知识语法汇总整理(一)

    mysql基础知识语法汇总整理(二)   连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...

  4. Oracle 数据库知识汇总篇

    Oracle 数据库知识汇总篇(更新中..) 1.安装部署篇 2.管理维护篇 3.数据迁移篇 4.故障处理篇 5.性能调优篇 6.SQL PL/SQL篇 7.考试认证篇 8.原理体系篇 9.架构设计篇 ...

  5. Mysql数据库知识-Mysql索引总结 mysql mysql数据库 mysql函数

    mysql数据库知识-Mysql索引总结: 索引(Index)是帮助MySQL高效获取数据的数据结构. 下边是自己整理的资料与自己的学习总结,,做一个汇总. 一.真的有必要使用索引吗? 不是每一个性能 ...

  6. MySQL高级知识(五)——索引分析

    前言:前面已经学习了explain(执行计划)的相关知识,这里利用explain对索引进行优化分析. 0.准备 首先创建三张表:tb_emp(职工表).tb_dept(部门表)和tb_desc(描述表 ...

  7. [转帖]xserver相关知识汇总

    xserver相关知识汇总 https://blog.csdn.net/QTVLC/article/details/81739984   本文主要是从以下几个方面介绍xorg-xserver 相关的知 ...

  8. web前端project师知识汇总

    分类: Web开发应用  一.何为Web前端project师?           前端project师,也叫Web前端开发project师.他是随着web发展.细分出来的行业.Web前端开发proj ...

  9. MySQL 基础知识梳理

    MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...

随机推荐

  1. pkuwc2018题解

    题解: 思路挺好想的..然而今天写代码写成傻逼了 d1t1: 首先比较暴力的就是$f[i][j]$表示i个这个点是j的概率 然后前缀和一下dp就是$n^2$的 部分分树形态随机就说明树深度是$log$ ...

  2. js判断是微信、QQ内置浏览器打开页面

    var ua = navigator.userAgent.toLowerCase(); if(ua.match(/MicroMessenger/i)=="micromessenger&quo ...

  3. 2018-2019 20165235 网络对抗技术 Exp0:kali的安装

    2018-2019 20165235 网络对抗技术 Exp0:kali的安装 安装kali 在官网上https://www.kali.org/下载kali 下载之后进行解压 打开VMware-> ...

  4. 支付宝红包口令自动复制到剪贴板脚本js,安卓,IOS通用版

    有客户找到涛舅舅,要求开发一个可以自动支付宝红包口令的js脚本,经过大量探索和优化,目前此脚本功能已经测试成功! 预期效果: 只要来访用户在当前网页的任意位置点击一下,支付宝红包口令即可复制到用户手机 ...

  5. C++输出

    setiosflags 意思就是设置输入输出的标志iso::fixed 是操作符setiosflags 的参数之一,该参数指定的动作是以带小数点的形式表示浮点数,并且在允许的精度范围内尽可能的把数字移 ...

  6. jquery 操作服务端控件,select 控件

    <asp:DropDownList ID="ddl" runat="server"></asp:DropDownList> <se ...

  7. NOIP2017 国庆郑州集训知识梳理汇总

    第一天 基础算法&&数学 day1难度测试 如果要用一个词来形容上午的测试,那真是体无完肤.  成绩: 题目 成绩 评价 T1 50 一般 T2 10 大失所望 T3 0 差 基础算法 ...

  8. slitaz的root密码

    可以先试试root(我这个版本就是),如果不行passwd改密码吧...

  9. On the Optimal Approach of Survivable Virtual Network Embedding in Virtualized SDN

    Introduction and related work 云数据中心对于虚拟技术是理想的创新地方. 可生存性虚拟网络映射(surviavable virtual network embedding ...

  10. 解决audio控制播放音量

    在写手机端项目时,可能会遇到使用audio播放音乐,那么怎样控制audio默认播放的音量呢?下面时解决办法 volume 属于是控制audio 播放音乐的音量,其范围0-1,1表示音量最大 getVi ...