02 MySQL基础知识
1. 版本
1.1 面试经历
笔者上周刚好有个面试,对方听到我说熟悉mysql,随后就来了一句,你使用的是什么版本的MSQL…
我知道是8.x,就凭着记忆说了个8.6
然后他说那你知道MySQL8.x和5.x的区别有哪些吗?
我是真说不上来…
那个面试给我的启发之一是:我们在使用一个技术/产品的时候应该关注多一些它的其他信息,比如版本以及该版本的新特性,选择使用该产品的理由等等…
1.2 查看mysql版本
在安装了MySQL并且配置好环境变量后,可以在cmd输入mysql -V
查看使用的mysql版本号。
C:\Users\Medi>mysql -V
mysql Ver 8.0.30 for Win64 on x86_64 (MySQL Community Server - GPL)
可以看到我的mysql版本是8.0.30。
1.3 mysql8.0新特性
以下只列举其中比较重要的特性,详见MySQL官网
- 性能提升
- 更强的NoSQL文档支持
- 窗口函数(Window Functions)
- UTF-8编码
- 隐藏索引
- 持久化设置
- 重构BLOB
- 事务性数据字典
- SQL角色
2. 配置文件my.ini
注:
Windows下mysql的配置文件默认名字为my.ini
Linux/Mac下默认为my.cnf
笔者博客的MySQL篇中相关操作基于Windows
默认位置:C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
配置内容:
- [client] 客户端参数
- [mysqld_safe] mysqld的守护进程
- [mysqld] 服务端基本配置
- Query Cache 查询缓存
- 错误日志
- 慢查询记录
- 全局查询日志
- 从属线程变量
- 安全变量
- 存储引擎配置:MyISAM变量,MEMORY变量,InnoDB变量
- WSREP配置
3. 连接MySQL的方式
回顾笔者在上一篇博客中提到的:
- 数据库实例才是真正用于操作数据库文件的;
- 应用层提供连接处理功能
《MySQL技术内幕 InnoDB存储引擎》中提到:
连接MySQL操作是一个连接进程和MySQL数据库实例进行通信,从程序设计的角度来说,本质上是进程通信。即MySQL数据库提供的连接方式从本质上看就是进程通信方式。
注:如果对进程通信比较了解,可以知道常用的进程通信方式有管道、命名管道、命名字、TCP/IP套接字、UNIX域套接字
3.1 TCP/IP
- 适用场景:任意平台,一般情况下客户端(client)在一台服务器上,而MySQL实例(server)在另一台服务器上,这两台机器通过TCP/IP网络连接。
> mysql -h [ip地址] -u [用户名] -P [端口号] -p
例如用户在Windows服务器下请求一个远程Linux服务器下的Mysql实例:
C:\Users\medi>mysql -u root -P 21313 -h 192.168.235.2 -p
Enter password: *************
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 20075
Server version: 8.0.30 MySQL Community Server - GPL
Copyright (c) 2000, 2022, 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>
在上面的示例中, 客户端使用root的用户去连接ip为192.168.235.2,端口为21313的远程MySQL实例。
MySQL的应用层处理连接请求:在接收到连接请求会检查mysql数据库下的user表,该表相当于是一张权限表,判断发起请求的客户端IP(host字段,%表示任意ip地址)是否允许连接到MySQL实例。
3.2 命名管道(Named Pipe)和共享内存
- 适用场景:使用命名管道方式连接 MySQL 只适合在部分 Windows 系统下用来连接本机的 MySQL ,性能可比一般的TCP/IP方式提升30%~50%。
MySQL默认是不启用命名管道连接方式,需要在配置文件中启用–enable-named-pipe选项。
在MySQL4.1之后的版本中,MySQL还提供了共享内存的连接方式,需要在配置文件中添加–shared-memory。除此之外,在连接时,MySQL客户端还必须适用–protocol=memory
3.3 UNIX域套接字(Socket)
- 适用场景:Linux和Unix环境下,MySQL客户端和数据库实例在一台服务器上。
用户可以在配置文件中指定套接字文件的路径,如–socket=/tmp/mysql.sock。
当数据库实例启动后,用户可以通过下列命令进行UNIX域套接字文件的查找:
mysql> SHOW VARIABLES LIKE 'socket';
在知道了UNIX域套接字文件的路径后,就可以适用该方式进行连接了:
mysql -u [用户名] -S [socket文件路径]
4. 常用指令
-
连接本地mysql
> mysql -u [用户名] -p
-
查看mysql版本
> mysql -V
-
查看本地数据库
mysql> SHOW DATAVASES;
-
查看系统配置参数
mysql> SHOW VARIABLES LIKE [xxx];
-
退出mysql
mysql> exit;
5. 自带的数据库
安装MySQL后,会发现它自带了下面四个数据库,这些数据库完全可以当成是普通的数据库,使用查询语句去获取其中的信息。
5.1 information_schema
提供了访问数据库元数据的方式。
注:元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。又称为“数据词 典”或“系统条目”。
主要的表有:
以下是主要的三个表:
- SCHEMATA:提供了当前mysql实例中所有数据库的信息,SHOW DATABASES就是从这里读取数据的。
- TABLES:提供了关于数据库中的表的信息(包括视图),包括表属于哪个schema(数据库),表引擎,类型(BASE TABLE | VIEW | SYSTEM VIEW),创建时间,备注等信息。
- STATISTICS:提供了关于表索引的信息
5.2 mysql
mysql的核心库,我们的用户、密码、权限等相关信息都存储在这里。使用grant命令和直接对这个数据库的user表进行增删改查的作用是相等的。
查看用户权限:
mysql> use mysql
Database changed
mysql> SELECT host,user
-> FROM user;
+-----------+------------------+
| host | user |
+-----------+------------------+
| % | medi |
| localhost | mysql.infoschema |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+------------------+
5 rows in set (0.19 sec)
mysql>
5.3 performance_schema
主要用于收集数据库服务器性能参数
5.4 sys
sys库是一个简单版的performance_schema
参考资料:
《MySQL技术内幕 InnoDB存储引擎》 -第2版 姜承尧著
https://www.cnblogs.com/jlonghe/p/13439391.html
https://kalacloud.com/blog/how-to-edit-mysql-configuration-file-my-cnf-ini/
https://cloud.tencent.com/developer/article/1453746