MySQL --- 汤神
数据库是什么?
是一类软件,这一类软件用来管理数据,能对数据进行保存,增删改查
数据结构是实现数据增删改查的具体方式
数据库则是管理数据的软件,实现数据库内部就用到了很多数据结构
MySQL (单挑搞不过,直接集群)
阿里大大推进了MySQL的进化,甚至可以支撑双十一这种可怕的业务场景
都是按照表格的形式来组织数据的
只要学会任何一个数据库,其他的数据库也能信手拈来
非关系型数据库和关系型数据库又差距很大了(也叫作NoSQL)
Redis,MangoDB,HBase
往往按照键值对或者文档来组织的
实际开发中很可能是关系型和非关系型数据库搭配使用的
总结:
上述这些数据库中,最广泛使用的还是MySQL
上述这些数据库分为关系型数据库和非关系型数据库,使用表的结构来组织数据
MySQL是一个"客户端-服务器"结构的程序
之前写的代码,最终都是编译成了一个程序,未来接触到的程序中,经常都是为了实现某个功能,需要多个程序
客户端(client)
服务器(server)
主动发起通信的一方,称为客户端
被动接受通信的一方,称为服务器
客户端给服务器发送的数据,称为请求 (Request)
服务器给客户端返回的数据,称为响应(Response)
客户端和服务器之间,通过网络数据交互
服务器特点:
1.被动的一方
2.一个服务器要给多个客户端提供服务(也有只给一个客户端提供服务的,比较少见)
MySQL是一个客户端-服务器结构的程序
可以在同一个主机上,也可以不在
主动发起请求的就是客户端,被动接收响应的就是服务器
MySQL使用服务器设备来存储和管理数据
MySQL使用硬盘来存储设备 硬盘--->必要的组成部分
cpu,主板,内存,硬盘
内存和硬盘的差别
1.硬盘比较大,内存比较小
2.硬盘读写速度慢,内存的读写速度慢
3.内存比硬盘成本更高(贵)
4.内存存储的数据,断电就会丢失,硬盘存储的数据断电也不会丢失,这就称为持久化存储
5.散热器
6.机箱
7.电源
8.显卡
--->促成现在的计算机通过内存+硬盘的方式存储数据
缓存时cpu内部用来存储数据的部分
寄存器,同样是cpu中存储数据的部分
寄存器是用来参与计算的,比如让计算机计算一个表达式
1+2+3+4
cpu先算1+2放到寄存器里
再用寄存器里的数据+3再保存+4
读写数据的速度是最快的
因为内存比寄存器慢太多了,所以引入了缓存
寄存器(几百字节)->内存(几个GB)
有三级缓存
cpu读内存的时候,往往会把一些数据放到缓存中
就会减少读取读取内存的次数,提高整体的效率
CPU,存储器,输入输出设备(冯诺依曼体系结构)
显卡也是一种芯片,叫做GPU,也是用来计算和逻辑判断的
希望电脑能显示更多更丰富的图像,
显示复杂图像,尤其是快速变化的图像,需要大量的算数运算(矩阵运算)
CPU(通用计算芯片) GPU(专用计算芯片)
图形领域,运算虽然很大,但是基本都是1+1的水平的
除了图形之外,人工智能的运算量也很大,但是运算简单
MySQL使用硬盘来存储数据(一个词可能有多种含义,需要结合上下文分析)
比如堆和栈->
- 操作系统
- 数据结构
- JVM中
数据的组织方式
- 数据库(database) -> 数据集合(逻辑上的数据集合) ->MySQL中存储了很多这样的数据集合
- 数据表(table) ->一个数据库,还能存储很多不同的数据,每组数据都使用数据表存储,一个表有很多row,都是一条记录,每一列称之为一个字段(field)
- ...
有一个正确的心态来针对出错,不要着急,不要不耐烦,这才是解决问题的前提~~
仔细阅读出错的信息,一般会明确告诉你出错的线索
排查错误是程序员的必备技能
java的char两个字节,能表示中文(使用的是unicode编码)
String就无法使用unicode,默认使用utf-8
因为unicode编码在按照字节挨在一起就不好断,不知道从哪到哪是一个完整的汉字
字符集:汉字在gbk是2个字节 在utf-8是三个字节
GBK:Windows简体中文版本默认的编码方式(有一定缺陷,两个字节只能表示六万多个不同的字符)
UTF-8 变长编码,一个UTF-8的字符可能是1,2,3,4个字节 能表示全时间任何一个语言文字,一般表示汉字是三个字节
utf8mb4 --->完整的utf8编码
CSGO 是FPS类型的游戏
1.针对database的操作
1.1创建数据库 create database 数据库名; SQL中的关键字
1.2展示数据库 show databases
1.3创建数据库的时候同时设置字符编码 create database java110 charset utf-8
1.4选中数据库 use java110
1.5删除数据库 drop database java110
工作中会接触到几套环境
1.办公环境
发一个笔记本/台式机
2.开发环境(写代码,编译代码,简单的运行代码)
有些公司开发环境就是办公环境(开发项目简单)
有些公司,开发环境需要配专门的机器(服务器)
3.测试环境(测试组的同学,把你写好的代码,进行测试时候使用的环境)
以上三种环境可以称为线下环境
4.生产环境(配置是最高的)
线上环境,可以由外界用户访问的(因为用户多了,压力就大了)需要增加机器,最后构成分布式系统(集群)
如果生产环境上出现bug,会出现什么后果?
可能直接影响到用户的体验. ---->更可能导致用户流失
如何知道生产环境是否稳定呢?
用监控程序盯着,并且当监控程序发生异常的时候,会通知程序员,"报警程序"
在工作中,怎么做才可以避免上述删库的操作的?
两个角度:
1.公司的角度:
1.1 更好的管理数据库的权限
高危操作的权限给到有经验的人手里 专门有一种岗位:DBA
1.2做好数据备份,万一你真的删了,可以快速恢复回来(付出更多的空间,将数据多保存几件)
备份操作,不太容易做到实时备份,一般是周期性备份,肯呢个把最近的一批数据丢失了
2.站在个人的角度
2.1一定要对生产环境的任何操作,一定要"心存敬畏"
2.2 如果确实需要操作生产环境,一定要拉一个有经验的人在旁边盯着(导师,领导,其他同事)
传承(企业文化)
语言分为两类
Lisp-> erlang,scala ->函数式编程 ->学习和写起来麻烦,正确性容易验证
c语言 ->写起来简单,不保证正确
数据库的表操作
mysql中支持的数据类型
数据表有很多列,每一列都是具体的类型
BIT[(M)] :比特位M个
TINYINT Byte 1
SMALLINT Short 2
INT Integer 4
BIGINT Long 8
FLOAT(M,D)
DOUBLE(M,D) M指定长度,D指定小数位数
使用float和double的时候,是存在缺陷的,不能精确存储的(IEEE754标准)
DECIMAL 也能表示小数,使用类似于字符串表示,舍弃了空间,更精确了
NUMERIC 和DECIMAL一样
字符串类型
VARCHAR(SIZE) :varchar是一个可变长的字符串.size是最大长度,size的单位是字符
设置长度上限是为了兜底
TEXT 长文本数据
MEDIUMTEXT 中等长文本数据
前面三个类型都是存储的字符串,文本数据
BLOB写的是二进制数据 (比较鸡肋,很少使用)
视频,音频,图片,动态库......就是二进制文件
DATETIME 8字节
TIMESTAMP 4字节 时间戳 (1970年1月1日0时0秒0分到现在的秒数/毫秒数/微秒数)
-21亿 - 4字节
到2038年,时间戳就要耗尽了
千年虫问题
计算机表示年份用两位数,到00年的时候gg
2038这个问题,破坏性大于千年虫
sql中的timestamp是4字节,java中是8字节
1.创建表
(得先选中数据库)
create table 表名 (列名 类型 ,列名 类型...);
一定要描述好每一列的类型和名字
类型放在后面的也有很多语言是这样的:go,py
注释横线空格- 或者井号来注释
2.查看表 show tables
queryOK 就是查询成功
所以在一个分布式系统中,数据库经常会成为性能瓶颈
高并发分布式很多工作都是在保护数据库不让数据库很容易就挂了
GHZ 10亿次/秒
3.查看表结构
desc 表名
这里的int(11)啥意思?
称为位宽,在mysql客户端打印的时候占据多大的宽度
int 的表示范围 -21亿- 21亿 (亿8个0,加上前面21和符号)
4.删除表 drop table 表名
一旦删错了,问题会比较严重
错误删除表引起的后果可能比删除整个数据库来的更大
如果删了整个库,后续数据库进行任何数据库操作都会出问题,程序员可能更早的发现问题
只删了一个表,大部分可能操作都是对的,少数操作是错的,就难以发现问题,问题会持续很久,当问题越积越多,造成影响就会更严重
一般单价不用decimal,因为空间占用大,算的慢
这里有个小技巧,可以让钱算的又快又精确
钱也可以用int,用分作为单位即可
order是关键字,想用它作为表名可以加反引号
` order `
学习的时候一定要多思考
1.业务确定
要解决什么问题,解决问题的进程就称为业务
写代码的初心就是解决问题,满足需求
产品经理(project manager pm) ->汇总的mrd文档中会有
2.技术确定
从性能/存储空间的角度来看待这里的长度
明确总的存储空间有多少,估算总的数据量是多少,再进一步把空间分配给每一列