二阶段day03 Git与SQL优化

知识回顾:

1)开发工具,设计阶段,表设计
PowerDesinger 15 UML+表设计

PD好处:

a. 可视化工具,表,表之间关系,字段,字段类型,长度
b. 它可以针对不同的数据库生成不同的SQL语句(建表、建立关系)
SQL标准 92年,但是不同厂家数据库它扩展了SQL92,有自己的语法
c. 消除不同语法支持,消除不同数据库之间大部分差异,方便开发

drop table if exists tb_student;

/*==============================================================*/
/* Table: tb_student                                            */
/*==============================================================*/
create table tb_student
(
   id                   int not null,
   name                 varchar(30),
   birthday             datetime,
   salary               decimal(8,2),
   primary key (id)
);
drop table TB_STUDENT cascade constraints;

/*==============================================================*/
/* Table: TB_STUDENT                                            */
/*==============================================================*/
create table TB_STUDENT  (
   ID                   INT                             not null,
   NAME                 VARCHAR2(30),
   BIRTHDAY             TIMESTAMP,
   SALARY               NUMERIC(8, 2),
   constraint PK_TB_STUDENT primary key (ID)
);

mysql和oracle不同:

a. 表名mysql习惯小写,oracle习惯大写
b. 字段名称mysql小写,oracle习惯大写
c. constraint 约束,主键语法不同
d. 字符串类型mysql叫varchar,oracle叫VARCHAR2
e. 日期类型,mysql叫datatime,oracle叫TIMESTAMP 时间戳
f. 浮点数类型,mysql叫decimal,oracle叫number,NUMERIC

结论:SQL都遵循SQL92标准,意味大多数SQL语句一样,但是少量SQL语句不一样
2)软件开发流程

a. 需求调研(* 端茶倒水)
b. 需求评审(专家)
c. 概要设计(系统分析师)
d. 详细设计(系统分析师)
e. 开发编码*
f. 测试 *(自测,单元测试;测试组:集成测试,压力测试)
g. 上线 * 指导客户使用系统
h. 维护期 * 指导客户深层使用系统
i. 项目结束

SQL语句

1)SQL好入门,insert,update,delete,select,精通难,select查询变化万千
a. 多练,对语法才熟练,in,like,join,聚合函数,分组,排序
b. 面试都会有SQL


今天的内容:

1)git
2)sql优化,原则、概率(死记原则)
3)程序要访问数据库,jdbc java方式数据库连接api,完成数据库的访问和维护

git下载官网:https://git-scm.com/
git入门教程: https://segmentfault.com/a/1190000024544709
git是什么东西呢?

百度百科:
git是一个分布式版本控制系统

版本控制: version control

举例:
Windows蓝屏,代码或者文档丢失;
项目中多个人编写一个文件,冲突;
代码写了很久了,想用以前的代码,找不着了,新的版本不太对,想恢复到旧的版本;

版本控制:
1.把你的文件上传到一个公共地方,公共地方存储这些文件(网盘)
2.为每一次用户的提交创建一个新文件,v1.0、v1.1、v1.2

市场上有哪些版本控制的产品?

a. CVS 第一代最成熟版本控制产品 2000 (几乎没人使用)
b. SVN 第二代最成熟版本控制产品 2005 (文档word/excel和代码code)
c. GIT 第三代最成熟版本控制产品 2008 (代码code)

SVN管理文档 (有权限,主要管理 文档+代码) 集中式管理(昂贵,没有网络没法干活)
GIT (公有和私有,权限粗,代码) 分布式管理(开源,有本地暂存区,有网络了在提交)
GIT不能完全的替代SVN,但是市场确实越来越少的使用SVN。

git技术(内部实现版本控制体系), 安装git是客户端工具
github git服务端(国外网站 ,全球,开源开发软件源码)
gitee GitHub的一个镜像 (复制品,每10分钟同步一次),软件国产化,名字:码云

git中提交本地变化到最终的远程仓库

1)add 把工作空间的内容形成日志操作,存放到本地索引
2)commit 把具体的变化(新增文件)放到本地仓库(复制)
3)push 把本地仓库内容放到远程仓库 (复制)

git中把远程仓库新内容拿到本地

1)clone把远程仓库内容直接克隆到工作空间,(隐含把内容也放到本地仓库一份)
第一次使用
2)pull 起到远程仓库和本地工作空间的内容同步,远程和本地数据一致

使用码云 gitee,必须先自己账号

1)在gitee有账号,就会有自己的私人空间
2)在本地安装Git-2.27.0-64-bit(本地客户端工具)
git bash(这里就可以敲入git命令 add,commit,push)

注意问题:权限,本地创建目录和文件(必须选择管理员:已管理员方式运行)
验证:git是否安装好了

二阶段day03 Git与SQL优化_第1张图片

如果从零开始:

  1. 远程仓库上先的有自己的一个仓库:新建一个仓库(网页仓库)
  2. 本地环境和远程仓库挂钩:git命令,clone克隆
    二阶段day03 Git与SQL优化_第2张图片
简易的命令行入门教程:

mkdir j2ee #创建本地仓库目录和远程仓库目录一致
cd j2ee #进入目录
git init #初始化
touch README.md #创建文件
git add README.md #新增文件到git中处理
git commit -m “first commit” #提交,设置说明信息
git remote add origin https://gitee.com/nutony/j2ee.git #远程仓库


二阶段day03 Git与SQL优化_第3张图片

查看配置、配置环境

二阶段day03 Git与SQL优化_第4张图片

使用git完成第一次提交二阶段day03 Git与SQL优化_第5张图片
第一次提交,全部代码案例

二阶段day03 Git与SQL优化_第6张图片

第二次提交

二阶段day03 Git与SQL优化_第7张图片


git开发常用工具,实现代码版本控制,团队开发

实际开发中,团队如何管理共享代码

日常每天操作命令:

1)早上一上班,先把远程内容同步本地(把最新的内容下载到本地)
2)如果代码变化测试本地已经没有问题,提交多次(add,commit,push)
3)在下午下班前,必须在提交新的内容

git add . //.点当前目录下包括子目录下的内容都记录日志
git commit -m “信息随便填写”
git push -u origin master

git开发常用工具,实现代码版本控制,团队开发
实际开发中,团队如何管理共享代码


day03下午笔记

日常开发每天都有涉及到git文件提交

1)add 把工作空间代码,记录它变化信息(新增,修改,删除)提交索引
2)commit -m “提交备注信息” 提交信息到本地仓库
3)push -u origin master 推送信息到远程仓库,在gitee网站来浏览信息

2.SQL优化

SQL实现一个业务有多种方式,总有一个方法相对而言最优,体现速度优化,对查询SQL而言
大多是一些实际中摸索出来的经验

SQL编译期(优化器) 我们提交SQL没有直接执行,SQL的优化器先进性优化
量变引起质变

SELECT * FROM student

SELECT id,NAME,sex,birthday,salary,age FROM student

准备测试数据
SQL中库,表括起来的不是单撇,叫刀秋,波浪线按键它下面的“单撇”
` 特殊字符,把特殊名字扩起来,例如:名称中有个空格

‘user name’


Varchar和char区别?

name varchar(6),char(6)
name=“tony” varchar 4 只存储真实长度,不大于声明的长度
name=“tony” char 6,如果内容不足,自动用空格补充
理由:
varchar变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间
char按声明大小存储,不足补空格
其次对于查询来说,在一个相对较小的字段内搜索,效率更高

decimal 浮点数 7,2 (3.14)
整数部分是几位? 5,不包括小数点
小数部分是几位? 2

创建表的主键,数据库系统会自动创建主键索引,也是唯一索引 unique

current_timestamp() mysql自定义函数(类似java api)当前时间
字段default默认值:不填null,

tinyint 小整型,类似java,short


SQL语句的执行顺序 重点:死记

(8) SELECT (9) DISTINCT column,… 选择字段、去重
(6) AGG_FUNC(column or expression),… 聚合
(1) FROM [left_table] 选择表
(3) JOIN 链接
(2) ON 链接条件
(4) WHERE 条件过滤
(5) GROUP BY 分组
(7) HAVING 分组过滤
(10) ORDER BY 排序
(11) LIMIT count OFFSET count; 分页


避免在where子句中使用or来连接条件

查询id为1或者薪水为3000的用户:
反例:
SELECT * FROM student WHERE id=1 OR salary=30000
正例:

使用union all

SELECT * FROM student WHERE id=1
UNION ALL
SELECT * FROM student WHERE salary=30000

分开两条sql写

SELECT * FROM student WHERE id=1
SELECT * FROM student WHERE salary=30000

理由:

使用or可能会使索引失效,从而全表扫描
对于or没有索引的salary这种情况,假设它走了id的索引,但是走到salary查询条件时,它还得全表扫描。
也就是说整个过程需要三步:全表扫描+索引扫描+合并。
如果它一开始就走全表扫描,直接一遍扫描就搞定。
虽然mysql是有优化器的,处于效率与成本考虑,遇到or条件,索引还是可能失效的。


尽量使用数值替代字符串类型

主键(id):primary key优先使用数值类型int,tinyint
性别(sex):0-代表女,1-代表男;数据库没有布尔类型,mysql推荐使用tinyint
支付方式(payment):1-现金、2-微信、3-支付宝、4-信用卡、5-银行卡
服务状态(state):1-开启、2-暂停、3-停止
商品状态(state):1-上架、2-下架、3-删除(伪删除)


查询尽量避免返回大量数据

如果查询返回数据量很大,就会造成查询时间过长,网络传输时间过长。
同时,大量数据返回也可能没有实际意义。
如返回上千条甚至更多,用户也看不过来。
通常采用分页,一页习惯10/20/50/100条。


使用explain分析你SQL执行计划

SQL很灵活,一个需求可以很多实现,那哪个最优呢?
SQL提供了explain关键字,它可以分析你的SQL执行计划,看它是否最佳。
Explain主要看SQL是否使用了索引。

EXPLAIN
SELECT * FROM student WHERE id=1

返回结果:
在这里插入图片描述


是否使用了索引及其扫描类型

type:
ALL 全表扫描,没有优化,最慢的方式
index 索引全扫描
range 索引范围扫描,常用语<,<=,>=,between等操作
ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询
const/system 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询
null MySQL不访问任何表或索引,直接返回结果
possible_keys:
显示可能应用在这张表中的索引
key:
真正使用的索引方式


创建name字段的索引

提高查询速度的最简单最佳的方式

#alter语法修改表,add index增加索引
#index_name 索引起个名字(针对哪个字段)
ALTER TABLE student ADD INDEX index_name (NAME)

优化like语句

模糊查询,程序员最喜欢的就是使用like,但是like很可能让你的索引失效
TYPE=ALL/INDEX/RANGE/ref/const

反例:

EXPLAIN
SELECT id,NAME FROM student WHERE NAME LIKE ‘%陈’ #index 索引全扫描,陈结尾

EXPLAIN
SELECT id,NAME FROM student WHERE NAME LIKE ‘%陈%’ #index 索引全扫描,包含陈

正例:

EXPLAIN
SELECT id,NAME FROM student WHERE NAME LIKE ‘陈%’ #通配符 range 索引范围扫描,陈开头

理由:

未使用索引:故意使用sex非索引字段
EXPLAIN
SELECT id,NAME FROM student WHERE NAME=1 OR sex=陈

主键索引生效
EXPLAIN
SELECT id,NAME FROM student WHERE id=陈

索引失效,type=ALL,全表扫描
EXPLAIN
SELECT id,NAME FROM student WHERE id LIKE ‘%陈’
#id varchar, type=ALL 没有使用索引,全表扫描,慢
#id int ,type=const 使用索引,常量,快


字符串怪现象

反例:
#未使用索引
EXPLAIN
SELECT * FROM student WHERE NAME=123
正例:
#使用索引
EXPLAIN
SELECT * FROM student WHERE NAME=‘123’
理由:
为什么第一条语句未加单引号就不走索引了呢?这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL会做隐式的类型转换,把它们转换为数值类型再做比较


索引不宜太多,一般5个以内

如果当数据新增、修改、删除、索引需要重构


索引不适合建在有大量重复数据的字段上

性别:男 、女
状态:1上架、2下架


where限定查询的数据

数据中假定就一个男的记录
反例:
SELECT id,NAME FROM student WHERE sex=‘男’
正例:
SELECT id,NAME FROM student WHERE id=1 AND sex=‘男’
理由:
需要什么数据,就去查什么数据,避免返回不必要的数据,节省开销


避免在索引列上使用内置函数

业务需求:查询最近七天内新生儿(用学生表替代下)
给birthday字段创建索引:
ALTER TABLE student ADD INDEX idx_birthday (birthday)
当前时间加7天:
SELECT NOW()
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY)
反例:
EXPLAIN
SELECT * FROM student
WHERE DATE_ADD(birthday,INTERVAL 7 DAY) >=NOW();
正例:
EXPLAIN
SELECT * FROM student
WHERE birthday >= DATE_ADD(NOW(),INTERVAL 7 DAY);


避免在where中对字段进行表达式操作

反例:
EXPLAIN
SELECT * FROM student WHERE id+1-1=+1 #索引失效
正例:
EXPLAIN
SELECT * FROM student WHERE id=+1-1+1

EXPLAIN
SELECT * FROM student WHERE id=1


避免在where子句中使用!=或<>操作符

应尽量避免在where子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。记住实现业务优先,实在没办法,就只能使用,并不是不能使用。如果不能使用,SQL也就无需支持了。
反例:
EXPLAIN
SELECT * FROM student WHERE salary!=3000

EXPLAIN
SELECT * FROM student WHERE salary<>3000


去重distinct过滤字段要少

#索引失效
EXPLAIN
SELECT DISTINCT * FROM student

#索引生效
#使用DISTINCT去重视,字段不能是所有
EXPLAIN
SELECT DISTINCT id,NAME FROM student

EXPLAIN
SELECT DISTINCT NAME FROM student
理由:
带distinct的语句占用cpu时间高于不带distinct的语句。因为当查询很多字段时,如果使用distinct,数据库引擎就会对数据进行比较,过滤掉重复数据,然而这个比较、过滤的过程会占用系统资源,如cpu时间


where中使用默认值代替null

环境准备:
#修改表,增加age字段,类型int,非空,默认值0
ALTER TABLE student ADD age INT NOT NULL DEFAULT 0;

#修改表,增加age字段的索引,名称为idx_age
ALTER TABLE student ADD INDEX idx_age (age);
反例:
EXPLAIN
SELECT * FROM student WHERE age IS NOT NULL
正例:
EXPLAIN
SELECT * FROM student WHERE age>0
理由:
1.并不是说使用了is null 或者 is not null 就会不走索引了,这个跟mysql版本以及查询成本都有关
2.如果mysql优化器发现,走索引比不走索引成本还要高,就会放弃索引,这些条件 !=,<>,is null,is not null经常被认为让索引失效,其实是因为一般情况下,查询的成本高,优化器自动放弃索引的
3.如果把null值,换成默认值,很多时候让走索引成为可能,同时,表达意思也相对清晰一点


总结:

1)git: 版本控制工具,管理我们项目的代码,主流开发工具公司会自己搭建一个Github,你的配置下,从公司库中下载代码
2)git (技术总称,客户端git bash)、GitHub(远程仓库-国外)、gitee(远程仓库-国内,镜像库,10分钟同步一次)
3)概念:
a.工作空间:仓库代码都放在工作空间,开发者可以直接操作
b.本地索引:它就记录对工作空间中改动(新增,修改文件内容,删除文件,包括文件夹)一次改动就是一条记录(相当于执行计划)
c.本地仓库:它存放项目中所有文件,含有其他同事的文件
d.远程仓库:它是我们所有库的一个容器(最全)GitHub、gitee、其他镜像网站

  1. 这4个内容是如何沟通的?
    1.add 把工作空间中的文件放到本地索引中,指定文件名
    add README.md
    add . 点代表当前目录下所有改变
    2.commit 把本地索引中内容存放到本地仓库中(内在的处理)
    commit -m “备注”
    3.push 把本地仓库中内容放到远程仓库(最终)远程仓库就有人最新代码,其他同事就可以更新我写的这部分代码
    4.pull/clone 拉取(同步) 远程仓库内容放到工作空间(本地仓库),克隆 就相当于复制,第一次从远程仓库保存数据下来
    5)git 每天要做的工作?
    add,commit,push 每写完一段代码,测试没问题,没有问题就上传
    pull 拉取最新项目代码

6)SQL执行的顺序:死记
7)SQL的优化

你可能感兴趣的:(JAVA第二阶段,数据库,java,git)