MySql综合知识汇总
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB
Mysql驱动:com.mysql.jdbc.Driver
MysqlURL:jdbc:mysql://localhost:3306/数据库名称
Oracle驱动:oracle.jdbc.OracleDriver
OracleURL:jdbc: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
数据库索引什么时候会失效?
- 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
2.对于多列索引,不是使用的第一部分,则不会使用索引
3.like查询是以%开头(以%结尾是可以的)
4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
mysql中常用的三种插入数据的语句
1.insert into表示插入数据,数据库会检查主键(PrimaryKey),如果出现重复会报错;
2.replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引的话,如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样;
3.insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据;
MySql综合知识汇总的更多相关文章
- mysql基础知识语法汇总整理(二)
mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...
- MySql面试题、知识汇总、牛客网SQL专题练习
点击名字直接跳转到链接: Linux运维必会的100道MySql面试题之(一) Linux运维必会的100道MySql面试题之(二) Linux运维必会的100道MySql面试题之(三) Linux运 ...
- mysql基础知识语法汇总整理(一)
mysql基础知识语法汇总整理(二) 连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...
- Oracle 数据库知识汇总篇
Oracle 数据库知识汇总篇(更新中..) 1.安装部署篇 2.管理维护篇 3.数据迁移篇 4.故障处理篇 5.性能调优篇 6.SQL PL/SQL篇 7.考试认证篇 8.原理体系篇 9.架构设计篇 ...
- Mysql数据库知识-Mysql索引总结 mysql mysql数据库 mysql函数
mysql数据库知识-Mysql索引总结: 索引(Index)是帮助MySQL高效获取数据的数据结构. 下边是自己整理的资料与自己的学习总结,,做一个汇总. 一.真的有必要使用索引吗? 不是每一个性能 ...
- MySQL高级知识(五)——索引分析
前言:前面已经学习了explain(执行计划)的相关知识,这里利用explain对索引进行优化分析. 0.准备 首先创建三张表:tb_emp(职工表).tb_dept(部门表)和tb_desc(描述表 ...
- [转帖]xserver相关知识汇总
xserver相关知识汇总 https://blog.csdn.net/QTVLC/article/details/81739984 本文主要是从以下几个方面介绍xorg-xserver 相关的知 ...
- web前端project师知识汇总
分类: Web开发应用 一.何为Web前端project师? 前端project师,也叫Web前端开发project师.他是随着web发展.细分出来的行业.Web前端开发proj ...
- MySQL 基础知识梳理
MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...
随机推荐
- pkuwc2018题解
题解: 思路挺好想的..然而今天写代码写成傻逼了 d1t1: 首先比较暴力的就是$f[i][j]$表示i个这个点是j的概率 然后前缀和一下dp就是$n^2$的 部分分树形态随机就说明树深度是$log$ ...
- js判断是微信、QQ内置浏览器打开页面
var ua = navigator.userAgent.toLowerCase(); if(ua.match(/MicroMessenger/i)=="micromessenger&quo ...
- 2018-2019 20165235 网络对抗技术 Exp0:kali的安装
2018-2019 20165235 网络对抗技术 Exp0:kali的安装 安装kali 在官网上https://www.kali.org/下载kali 下载之后进行解压 打开VMware-> ...
- 支付宝红包口令自动复制到剪贴板脚本js,安卓,IOS通用版
有客户找到涛舅舅,要求开发一个可以自动支付宝红包口令的js脚本,经过大量探索和优化,目前此脚本功能已经测试成功! 预期效果: 只要来访用户在当前网页的任意位置点击一下,支付宝红包口令即可复制到用户手机 ...
- C++输出
setiosflags 意思就是设置输入输出的标志iso::fixed 是操作符setiosflags 的参数之一,该参数指定的动作是以带小数点的形式表示浮点数,并且在允许的精度范围内尽可能的把数字移 ...
- jquery 操作服务端控件,select 控件
<asp:DropDownList ID="ddl" runat="server"></asp:DropDownList> <se ...
- NOIP2017 国庆郑州集训知识梳理汇总
第一天 基础算法&&数学 day1难度测试 如果要用一个词来形容上午的测试,那真是体无完肤. 成绩: 题目 成绩 评价 T1 50 一般 T2 10 大失所望 T3 0 差 基础算法 ...
- slitaz的root密码
可以先试试root(我这个版本就是),如果不行passwd改密码吧...
- On the Optimal Approach of Survivable Virtual Network Embedding in Virtualized SDN
Introduction and related work 云数据中心对于虚拟技术是理想的创新地方. 可生存性虚拟网络映射(surviavable virtual network embedding ...
- 解决audio控制播放音量
在写手机端项目时,可能会遇到使用audio播放音乐,那么怎样控制audio默认播放的音量呢?下面时解决办法 volume 属于是控制audio 播放音乐的音量,其范围0-1,1表示音量最大 getVi ...