今天开启开发中的一个很深也很重要的坑 - 数据库,java开发中最常使用的数据库就是关系型数据库,而关系型数据库中使用最多的一款数据库就是MySQL数据库,今天就对此做一个初步的梳理了解。
一、数据库
1.1、什么是数据库?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。在开发中,主要是由后端跟数据库进行交互,是数据持久化(术语:即将数据存储在硬盘上)的一种重要的形式,比如系统的用户名和密码就需要存储持久化存储,数据库可以满足这一要求。
1.2、为什么叫关系型数据库
关系型是指数据的存储结构,数据库中的每一个表是一个实体(或一个对象),表与表之间存在某种或几种关系,以医院管理系统为例,数据库中可能有医生表、药品表、处方表、患者表等,而它们之间的关系可以表示为:医生给某一患者开的药方上有某种或几种药品,这种关系可以通过主键和外键(术语:数据库中表示关系的一种常用的方法)进行关联。
1.3、还有什么类型的数据库?
非关系型:代表为MongoDB,数据以json文件形式存储,适合业务更灵活的场景。
内存数据库:使用时数据存在内存中,速度快于磁盘,适用于特定的业务场景,代表为Memcached、Redis
时间序列数据库:常在监控系统使用,现在大名鼎鼎的prometheus即使用这种数据库
混合数据库:随着大数据的兴起,数据仓库这一概念逐渐落地,混合列和行数据库的混合型数据库在一些场景下开始使用。
1.4、数据库管理工具
在实际使用中,一般都是用管理工具连接数据库进行操作,可以做到可视化的方式连接数据库,提高开发人员的开发效率。常用的工具有:MySQL Workbench和Navicat。
二、MySQL数据库
MySQL是关系型数据库的代表,其最大的特点就是免费和学习资源丰富,不但可以用于学习和模拟,还被各行各业应用在具体的生产活动中,下面就对MySQL做一简单但干货满满的简介。
2.1、常见术语
数据库:表的集合。
表:数据的存储矩阵,表的格式跟excel类似,可以看作是一个java对象。
列:列数据可以看作是java对象中的某一个属性,一列数据是同种类型数据的和。
行:一行可以看做是一个对象的实例,比如医生表中的一行数据可以代表一名医生。
主键:一个表中只能有一个主键,主键是唯一的。
外键:外键用于关联两个表。
索引:使用索引可以更快速的访问数据库中的特定信息,类似于书籍中的目录。
2.2、MySQL管理
数据库在计算机上安装成功后,需要进行相应的启动、关闭、创建新账号等管理工作。
2.2.1、windows下管理
服务启动:net start mysql
服务关闭:net stop mysql
2.2.2、linux下管理
服务启动:sudo systenctl start mysql / sudo service mysql start
服务关闭:sudo systemctl stop mysql / sudp service mysql stop
服务重启:sudo systemctl restart mysql / sudo service mysql resart
状态检查:sudo systemctl status mysql / sudo service mysql status
创建用户:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
# Username:用户名
# Host:指定用户可以从哪些主机连接(localhost:只能用本地连接,%可以任何主机连接)
# Password:密码
授权权限:
GRANT privileges ON database_name.* TO 'username'@'host';
# Privileges:可以授权的权限(all rivileges、select、insert、update、delete等)
# Database_name.*:表示对某个数据库或表授权。(.*表示对整个数据库都授权,.table_name表示对指定表授权)
# TO 'username'@'host':指定授予权限的用户和主机
刷新权限:
FLUSH PRIVILEGES;
查看用户权限:
SHOW GRANTS FOR 'username'@'host';
撤销权限:
REVOKE ALL PRIVILEGES ON test_db.* FROM 'john'@'localhost';
删除用户:
DROP USER 'username'@'host';
修改用户密码:
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';
配置文件:
/etc/my.cnf
基本设置:
basedir: MySQL 服务器的基本安装目录。
datadir: 存储 MySQL 数据文件的位置。
socket: MySQL 服务器的 Unix 套接字文件路径。
pid-file: 存储当前运行的 MySQL 服务器进程 ID 的文件路径。
port: MySQL 服务器监听的端口号,默认是 3306。
服务器选项:
bind-address: 指定 MySQL 服务器监听的 IP 地址,可以是 IP 地址或主机名。
server-id: 在复制配置中,为每个 MySQL 服务器设置一个唯一的标识符。
default-storage-engine: 默认的存储引擎,例如 InnoDB 或 MyISAM。
max_connections: 服务器可以同时维持的最大连接数。
thread_cache_size: 线程缓存的大小,用于提高新连接的启动速度。
query_cache_size: 查询缓存的大小,用于提高相同查询的效率。
default-character-set: 默认的字符集。
collation-server: 服务器的默认排序规则。
性能调优:
innodb_buffer_pool_size: InnoDB 存储引擎的缓冲池大小,这是 InnoDB 性能调优中最重要的参数之一。
key_buffer_size: MyISAM 存储引擎的键缓冲区大小。
table_open_cache: 可以同时打开的表的缓存数量。
thread_concurrency: 允许同时运行的线程数。
安全设置:
skip-networking: 禁止 MySQL 服务器监听网络连接,仅允许本地连接。
skip-grant-tables: 以无需密码的方式启动 MySQL 服务器,通常用于恢复忘记的 root 密码,但这是一个安全风险。
auth_native_password=1: 启用 MySQL 5.7 及以上版本的原生密码认证。
日志设置:
log_error: 错误日志文件的路径。
general_log: 记录所有客户端连接和查询的日志。
slow_query_log: 记录执行时间超过特定阈值的慢查询。
log_queries_not_using_indexes: 记录未使用索引的查询。
复制设置:
master_host 和 master_user: 主服务器的地址和复制用户。
master_password: 复制用户的密码。
master_log_file 和 master_log_pos: 用于复制的日志文件和位置。
常用的MySQL命令:
Use database_name; #选择要操作的数据库名称
Show databases; #列出全部数据库
Show tables; #显示数据库中所有的表
Show columns from table_name; #显示数据库的属性、属性类型、主键信息等
Show INDEX from table_name; #显示表的索引信息
Show table status from database_name; #显示数据库的所有表的信息及性能
2.3、mysql操作
连接数据库:mysql -u username -p # -u用于指定用户名,-p表示后续需要输入密码
在命令行中输入命令后,系统提示输入:password:,回车后如果登录成功会光标会变为“mysql>”
退出数据库客户端:使用exit或quit,必须以;结尾
2.4、常用语句
在分享语句之前,首先分享下数据库对语句的一个分类,一般分成DDL、DML、DCL和TCL四种:
DDL(Data Definition Languages):数据定义语句,用来创建数据库中的表、索引、视图、存储过程和触发器等,常用的包括CREATE,ALTER,DROP,TRUNCATE,COMMENT,RENAME。
DML(Data Manipulation Language):数据操作语句,用来查询、添加、更新、删除等,SELECT,INSERT,UPDATE,DELETE,MERGE,CALL,EXPLAIN PLAN,LOCK TABLE,包括通用性的增删改查。
DCL(Data Control Language):数据控制语句,用于授权/撤销数据库及其字段的权限,GRANT,REVOKE。
TCL(Transaction Control Language):事务控制语句,用于控制事务,常用的语句关键字有:COMMIT,ROLLBACK,SAVEPOINT,SET TRANSACTION。
2.4.1、语句:
创建数据库:CREATE DATABASE 数据库名;
删除数据库:
mysql> DROP DATABASE 数据库名; -- 直接删除数据库,不检查是否存在
DROP DATABASE IF EXISTS 数据库名; -- 删除数据库,如果存在的话
创建表:
1、不带任何要求的最普通方式:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...
);
# table_name 是你要创建的表的名称。
# column1, column2, ... 是表中的列名。
# datatype 是每个列的数据类型。
2. 生产情况:
需要对指定一些参数,一般是放在CREATE TABLE语句括号的最后,一般的配置如下:
ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='表的整体注释,一般对表的含义做出说明';
插入数据:
INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
# table_name 是你要插入数据的表的名称。
# column1, column2, column3, ... 是表中的列名。
# value1, value2, value3, ... 是要插入的具体数值。
查询数据:
SELECT column1, column2, ...
FROM table_name
[WHERE condition]
[ORDER BY column_name [ASC | DESC]]
[LIMIT number];
上述案例中带有最常用的筛选条件:列条件筛选、排序和返回有限的数据
# column1, column2, ... 是你想要选择的列的名称,如果使用 * 表示选择所有列。
# table_name 是你要从中查询数据的表的名称。
# WHERE condition 是一个可选的子句,用于指定过滤条件,只返回符合条件的行。
# ORDER BY column_name [ASC | DESC] 是一个可选的子句,用于指定结果集的排序顺序,默认是升序(ASC)。
# LIMIT number 是一个可选的子句,用于限制返回的行数。
三、总结
本文对数据库概念和一些最常见的命令进行了梳理,对自己也是一次复习,也希望能帮助到屏幕前的你,感谢阅读。