当前位置: 首页 > news >正文

MySql综合知识汇总

本文实验的测试环境: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表示,如果中已经存在相同的记录,则忽略当前新数据;

 

转载于:https://www.cnblogs.com/binghuaZhang/p/10780480.html

相关文章:

  • FullCalendar Timeline View 使用
  • 08-图9 关键活动 (30 分)
  • Numpy用户指南
  • 涨姿势:抛弃字母、数字和下划线写SHELL
  • c++实现扫描检测硬件改动
  • 百度地图API获取数据
  • leetcode 338. 比特位计数(Counting Bits)
  • 2019-04-30vmware虚拟机安装macos 10.8格式为iso
  • 【Python爬虫】听说你又闹书荒了?豆瓣读书9.0分书籍陪你过五一
  • Player Settings-Web
  • c++11多线程笔记
  • 微软UWP应用,导航栏设计。
  • Python 之继承
  • 写给我即将出生小孩的第一封信
  • Centos6.5安装Redis3.2.8
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 2017-09-12 前端日报
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • C# 免费离线人脸识别 2.0 Demo
  • JavaScript DOM 10 - 滚动
  • Node + FFmpeg 实现Canvas动画导出视频
  • oldjun 检测网站的经验
  • Python - 闭包Closure
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 关于for循环的简单归纳
  • 免费小说阅读小程序
  • 前端学习笔记之观察者模式
  • 使用 QuickBI 搭建酷炫可视化分析
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ![CDATA[ ]] 是什么东东
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #define 用法
  • #Linux(帮助手册)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (分布式缓存)Redis哨兵
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm高校实验室 毕业设计 800008
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)重识new
  • *1 计算机基础和操作系统基础及几大协议
  • .net core控制台应用程序初识
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇