数据结构是实现数据增删改查的具体方式

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 数据结构是实现数据增删改查的具体方式

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使用硬盘来存储数据(一个词可能有多种含义,需要结合上下文分析)

比如堆和栈->

  1. 操作系统
  2. 数据结构
  3. JVM中

数据的组织方式

  1. 数据库(database)  -> 数据集合(逻辑上的数据集合) ->MySQL中存储了很多这样的数据集合
  2. 数据表(table) ->一个数据库,还能存储很多不同的数据,每组数据都使用数据表存储,一个表有很多row,都是一条记录,每一列称之为一个字段(field)
  3. ...

有一个正确的心态来针对出错,不要着急,不要不耐烦,这才是解决问题的前提~~

仔细阅读出错的信息,一般会明确告诉你出错的线索

排查错误是程序员的必备技能

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.技术确定

从性能/存储空间的角度来看待这里的长度

明确总的存储空间有多少,估算总的数据量是多少,再进一步把空间分配给每一列

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
设计模式 安全 Java
HashMap底层原理:数据结构+put()流程+2的n次方+死循环+数据覆盖问题
假如有T1、T2两个线程同时对某链表扩容,他们都标记头结点和第二个结点,此时T2阻塞,T1执行完扩容后链表结点顺序反过来,此时T2恢复运行再进行翻转就会产生环形链表,即B.next=A;采用2的指数进行扩容,是为了利用位运算,提高扩容运算的效率。JDK8中,HashMap采用尾插法,扩容时链表节点位置不会翻转,解决了扩容死循环问题,但是性能差了一点,因为要遍历链表再查到尾部。例如15(即2^4-1)的二进制为1111,31的二进制为11111,63的二进制为111111,127的二进制为1111111。
HashMap底层原理:数据结构+put()流程+2的n次方+死循环+数据覆盖问题
|
6月前
|
存储 监控 NoSQL
Redis处理大量数据主要依赖于其内存存储结构、高效的数据结构和算法,以及一系列的优化策略
【5月更文挑战第15天】Redis处理大量数据依赖内存存储、高效数据结构和优化策略。选择合适的数据结构、利用批量操作减少网络开销、控制批量大小、使用Redis Cluster进行分布式存储、优化内存使用及监控调优是关键。通过这些方法,Redis能有效处理大量数据并保持高性能。
97 1
|
2月前
|
存储 C语言 C++
数据结构基础详解(C语言) 顺序表:顺序表静态分配和动态分配增删改查基本操作的基本介绍及c语言代码实现
本文介绍了顺序表的定义及其在C/C++中的实现方法。顺序表通过连续存储空间实现线性表,使逻辑上相邻的元素在物理位置上也相邻。文章详细描述了静态分配与动态分配两种方式下的顺序表定义、初始化、插入、删除、查找等基本操作,并提供了具体代码示例。静态分配方式下顺序表的长度固定,而动态分配则可根据需求调整大小。此外,还总结了顺序表的优点,如随机访问效率高、存储密度大,以及缺点,如扩展不便和插入删除操作成本高等特点。
196 5
|
5月前
|
存储 JavaScript 前端开发
JavaScript中的数组是核心数据结构,用于存储和操作序列数据
【6月更文挑战第22天】JavaScript中的数组是核心数据结构,用于存储和操作序列数据。创建数组可以使用字面量`[]`或`new Array()`。访问元素通过索引,如`myArray[0]`,修改同样如此。常见方法包括:`push()`添加元素至末尾,`pop()`移除末尾元素,`shift()`移除首元素,`unshift()`添加到开头,`join()`连接为字符串,`slice()`提取子数组,`splice()`进行删除、替换,`indexOf()`查找元素位置,`sort()`排序数组。还有其他如`reverse()`、`concat()`等方法。
131 2
|
6月前
|
存储 算法 安全
AVB数据解析:Android verified boot 2.0 vbmeta 数据结构解析
AVB数据解析:Android verified boot 2.0 vbmeta 数据结构解析
615 0
|
5月前
【海贼王的数据航海】栈和队列
【海贼王的数据航海】栈和队列
28 0
|
5月前
|
设计模式 Java C++
数据结构篇:数据拷贝、深拷贝、重载与移动构造
数据结构篇:数据拷贝、深拷贝、重载与移动构造
25 0
|
5月前
|
算法 搜索推荐
数据结构和算法——快速排序(算法概述、选主元、子集划分、小规模数据的处理、算法实现)
数据结构和算法——快速排序(算法概述、选主元、子集划分、小规模数据的处理、算法实现)
42 0
|
5月前
|
存储 算法
数据结构和算法学习记录——特殊线性表之队列-队列的概念、队列结构体类型定义 、基本接口函数、初始化函数、销毁队列函数、入队列函数、判断队列是否为空、出队列函数、读取队头队尾的数据 、计算队列数据个数
数据结构和算法学习记录——特殊线性表之队列-队列的概念、队列结构体类型定义 、基本接口函数、初始化函数、销毁队列函数、入队列函数、判断队列是否为空、出队列函数、读取队头队尾的数据 、计算队列数据个数
40 0