目录什么是数据库主流数据库基本使用连接和退出创建数据库使用数据库创建数据库表表中插入数据查询表中的数据mysql的架构SQL 语句分类存储引擎什么是数据库存储数据用文件就可以了为什么还要弄个数据库? 因为文件保存数据有以下几个缺点文件的安全性问题文件不利于数据的增删改查一般文件确实提供了数据的存储和基本的读写功能但对文件内容做增删改查如果没有数据库程序员要自己写代码做增删改查不方便有时候甚至不可能完成而有了数据库只需要告诉它需求它自动完成文件不利于存储海量数据文件在程序中控制不方便为了解决上述问题专家们设计出更加利于管理数据的东西——数据库它能更有效的管理数据。数据库的水平是衡量一个程序员水平的重要指标。数据库一般指的是在磁盘或内存中存储的特定结构组织的数据。[rootVM-16-12-centos mysql]# which mysql /usr/bin/mysql [rootVM-16-12-centos mysql]# which mysqld /usr/sbin/mysqld上面的 mysql 是 mysql 的客户端mysqld 是 mysql 的服务端。mysql 的本质是一种基于 C(mysql) S (mysqld) 模式的一种网络服务。[rootVM-16-12-centos mysql]# netstat -nltp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp6 0 0 :::3306 :::* LISTEN 22085/mysqld主流数据库SQL Sever 微软的产品.Net程序员的最爱中大型项目。Oracle 甲骨文产品适合大型项目复杂的业务逻辑并发一般来说不如MySQL。MySQL世界上最受欢迎的数据库属于甲骨文并发性好不适合做复杂的业务。主要用在电商SNS论坛。对简单的SQL处理效果好。PostgreSQL:加州大学伯克利分校计算机系开发的关系型数据库不管是私用商用还是学术研究使用可以免费使用修改和分发。SQLite 是一款轻型的数据库是遵守ACID的关系型数据库管理系统它包含在一个相对小的C库中。它的设计目标是嵌入式的而且目前已经在很多嵌入式产品中使用了它它占用资源非常的低在嵌入式设备中可能只需要几百K的内存就够了。H2 是一个用Java开发的嵌入式数据库它本身只是一个类库可以直接嵌入到应用项目中。基本使用连接和退出mysql -h 127.0.0.1 -P 3306 -u root -p参数解释参数含义在本命令中的值-h指明 host主机地址127.0.0.1—— 本机回环地址即连接本地的 MySQL 服务-P指明 port端口号大写 P3306—— MySQL 默认监听端口-u指明 user用户名root—— MySQL 的超级管理员账户-ppassword密码小写 p后不跟具体密码执行后会提示你交互式输入更安全避免密码暴露在命令行历史中-p后直接跟密码如-p123456也是允许的但不安全因为密码会明文留在命令历史中。注意-h和-P如果省略默认就是127.0.0.1和3306所以本命令等效于简写mysql -u root -p链接成功后在 mysql 的命令行输入 quit 即可退出[rootVM-16-12-centos mysql]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7.44 MySQL Community Server (GPL) Copyright (c) 2000, 2023, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type help; or \h for help. Type \c to clear the current input statement. mysql quit Bye创建数据库链接数据库后输入注意 mysql 指令要用 ; 作为结尾show databases;结果-------------------- | Database | -------------------- | information_schema | | mysql | | performance_schema | | sys | -------------------- 4 rows in set (0.00 sec)退出 mysql 使用 vim 查看 /etc/my.cnf[mysqld] # # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size 128M # # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size 128M # sort_buffer_size 2M # read_rnd_buffer_size 2M datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links0 log-error/var/log/mysqld.log pid-file/var/run/mysqld/mysqld.pid skip-grant-tables character-set-serverutf8 default-storage-engineinnodb这就是 mysql 的配置文件其中datadir/var/lib/mysql 就是数据库的存储目录我们查看这个目录下的文件[rootVM-16-12-centos mysql]# ls /var/lib/mysql auto.cnf client-cert.pem ibdata1 ibtmp1 mysql.sock.lock public_key.pem sys ca-key.pem client-key.pem ib_logfile0 mysql performance_schema server-cert.pem ca.pem ib_buffer_pool ib_logfile1 mysql.sock private_key.pem server-key.pem我们发现 mysql 现在的数据库其实就是 /var/lib/mysql 的子目录。我们再链接上 mysql 输入create database helloworld;mysql create database helloworld; Query OK, 1 row affected (0.00 sec) mysql show databases; -------------------- | Database | -------------------- | information_schema | | helloworld | | mysql | | performance_schema | | sys | -------------------- 5 rows in set (0.00 sec)再退出 mysql 查看 /var/lib/mysql[rootVM-16-12-centos mysql]# ls /var/lib/mysql auto.cnf client-cert.pem ib_buffer_pool ib_logfile1 mysql.sock private_key.pem server-key.pem ca-key.pem client-key.pem ibdata1 ibtmp1 mysql.sock.lock public_key.pem sys ca.pem helloworld ib_logfile0 mysql performance_schema server-cert.pem发现多了 helloworld 这一目录说明创建数据库的本质就是创建 Linux 文件目录我们查看helloworld 这一目录[rootVM-16-12-centos mysql]# ls /var/lib/mysql/helloworld db.opt使用数据库链接上 mysql 后上面输入 show databases; 后展示了 information_schema、mysql、performance_schema、sys和我们自己创建的 helloworld 等等数据库输入use helloworld;可以对开始特定的数据库进行操作。创建数据库表上面选择 helloworld 这个数据库后输入create table student( id int, name varchar(32), gender varchar(2) );查看 /var/lib/mysql/helloworld[rootVM-16-12-centos mysql]# ls /var/lib/mysql/helloworld db.opt student.frm student.ibd与上面相比多了 student.frm student.ibd 这两个文件说明创建数据库表本质就是创建 Linux 目录下的文件表中插入数据在 mysql 命令行输入insert into student (id, name, gender) values (1, 张三, 男); insert into student (id, name, gender) values (2, 李四, 女); insert into student (id, name, gender) values (3, 王五, 男);查询表中的数据select * from student;mysql的架构逻辑架构四层结构MySQL 采用客户端/服务器模式从你输入命令到返回结果经历了下面这几层SQL 语句分类DDL【data definition language】 数据定义语言用来维护存储数据的结构代表指令: create, drop, alterDML【data manipulation language】 数据操纵语言用来对数据进行操作代表指令 insertdeleteupdateDML中又单独分了一个DQL数据查询语言代表指令 selectDCL【Data Control Language】 数据控制语言主要负责权限管理和事务代表指令 grantrevokecommit存储引擎存储引擎是数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。MySQL的核心就是插件式存储引擎支持多种存储引擎。查看存储引擎show engines \Gmysql show engines \G *************************** 1. row *************************** Engine: InnoDB Support: DEFAULT Comment: Supports transactions, row-level locking, and foreign keys Transactions: YES XA: YES Savepoints: YES *************************** 2. row *************************** Engine: MRG_MYISAM Support: YES Comment: Collection of identical MyISAM tables Transactions: NO XA: NO Savepoints: NO *************************** 3. row *************************** Engine: MEMORY Support: YES Comment: Hash based, stored in memory, useful for temporary tables Transactions: NO XA: NO Savepoints: NO *************************** 4. row *************************** Engine: BLACKHOLE Support: YES Comment: /dev/null storage engine (anything you write to it disappears) Transactions: NO XA: NO Savepoints: NO *************************** 5. row *************************** Engine: MyISAM Support: YES Comment: MyISAM storage engine Transactions: NO XA: NO Savepoints: NO *************************** 6. row *************************** Engine: CSV Support: YES Comment: CSV storage engine Transactions: NO XA: NO Savepoints: NO *************************** 7. row *************************** Engine: ARCHIVE Support: YES Comment: Archive storage engine Transactions: NO XA: NO Savepoints: NO *************************** 8. row *************************** Engine: PERFORMANCE_SCHEMA Support: YES Comment: Performance Schema Transactions: NO XA: NO Savepoints: NO *************************** 9. row *************************** Engine: FEDERATED Support: NO Comment: Federated MySQL storage engine Transactions: NULL XA: NULL Savepoints: NULL 9 rows in set (0.00 sec)InnoDB默认引擎MySQL 5.5绝对的主流99%的业务场景都用它。特性说明事务完整支持 ACID有COMMIT、ROLLBACK、崩溃恢复锁粒度行级锁Row-Level Lock高并发下性能好外键支持外键约束保证数据一致性索引使用B 树数据和索引存储在一起聚簇索引MVCC多版本并发控制实现非阻塞读提高并发性能物理文件.ibd文件数据和索引、ib_logfile重做日志适用场景几乎一切事务型业务——电商订单、用户账户、支付系统、内容管理系统。MyISAMMySQL 5.5 之前的默认引擎老牌引擎现在已边缘化但仍有很多历史遗留系统在用。特性说明事务❌ 不支持锁粒度表级锁Table-Level Lock写操作会锁整张表外键❌ 不支持索引使用 B 树但数据和索引分开存储非聚簇索引压缩支持表压缩可大幅节省空间物理文件.frm表结构、.MYD数据、.MYI索引优点读操作极快占用空间小。缺点写操作锁表并发差崩溃后难以恢复。适用场景纯只读报表、数据仓库、日志分析几乎不写入的场景。Memory内存引擎数据全部存在内存中重启即丢失。特性说明存储位置内存RAM读写极快持久化❌ 不持久服务重启数据全丢锁粒度表级锁索引默认使用 Hash 索引也支持 B 树适用数据量小数据量受max_heap_table_size限制适用场景临时表、缓存表、会话数据、高频查询的字典表如省市区编码。Archive归档引擎特性说明压缩比极高以 zlib 压缩存储操作只支持INSERT和SELECT不支持UPDATE/DELETE索引只支持自增主键索引锁粒度行级锁适用场景日志归档、审计记录、历史数据冷存储。其他引擎了解即可引擎特点场景CSV数据存为 CSV 文件与 Excel/外部系统交换数据Blackhole写入的数据直接丢弃黑洞用于主从复制中的中继或性能测试Federated访问远程 MySQL 表不存本地数据数据联邦查询现较少用对比总结面试重点对比维度InnoDBMyISAMMemory事务✅❌❌行级锁✅❌表锁❌表锁外键✅❌❌崩溃恢复✅通过 Redo Log❌❌MVCC✅❌❌数据与索引存储聚簇在一起非聚簇分开非聚簇全文索引✅5.6支持✅❌空间占用较大较小极小内存适用场景事务型OLTP只读报表临时缓存
网站建设
高端定制
企业官网