MySQL学习从零开始--第八部分
-
什么是视图,用于什么场景
-
视图是一个虚拟表,本质上是一个select查询的结果集,它并不实际存储数据,依赖基础表
CREATE VIEW view_name AS SELECT column1, column2 FROM table_name WHERE condition;
-
使用场景:
- 简化复杂查询(多表连接/过滤封装)
- 实现数据隔离与权限控制(只暴露部分字段)
- 数据统计的统一口径(如日报/报表)
- 不改变表结构实现灵活的逻辑分离
-
-
什么是存储过程,什么是函数
-
存储过程的一组预编译的SQL语句集合,逻辑上可实现流程控制,由服务器执行
DELIMITER // CREATE FUNCTION get_tax(price DECIMAL(10,2)) RETURNS DECIMAL(10,2) BEGINRETURN price * 0.1; END // DELIMITER ;
-
函数:与过程类似,但必须有返回值,常用于计算结果的返回
-
-
生产环境中应该使用存储过程吗?还是应该在应用层中实现
- 优先应用层:业务逻辑应在应用层实现,提高可维护性和跨数据库兼容性
- 存储过程适用场景
- 复杂 SQL 逻辑(如多表连接、递归查询)
- 性能敏感的批量操作
- 需要数据库事务强一致性保证的场景
-
主数据库中应该进行大量计算吗?还是应该在其他机器中进行
-
主数据库不建议承担大量计算,尤其是复杂聚合、报表、分析任务,原因包括:
- 影响主库响应事务请求,降低写性能
- 占用IO、CPU,拖慢主业务
建议:
- 主库只负责核心读写
- 使用 从库或单独分析数据库 进行报表/计算
- 可以引入 ETL中间层 或 数据仓库 系统(如Hive)
-
-
如何查看Mysql数据库中有哪些mysql用户
-
-- 查看所有用户 SELECT User, Host FROM mysql.user;-- 查看加密后的用户密码(需有权限) SELECT User, authentication_string FROM mysql.user;
-
-
如何限制用户的连接地址
-
MySQL在创建用户时可以指定ip地址或主机名
CREATE USER 'username'@'192.168.1.100' IDENTIFIED BY 'password';
-
只限制本地访问
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
-
-
应当创建一个额外的管理员用户来代替root,并且禁用root用户吗?为什么
应当创建
- 创建专用管理员用户(如
dbadmin
) - 限制 root 用户仅用于紧急恢复
- 不要完全禁用 root,保留紧急访问能力
原因:
- 遵循最小权限原则,降低账户泄露风险
- 便于审计和追踪管理操作
- 避免 root 密码被滥用
- 创建专用管理员用户(如
-
如何创建一个新用户,使其拥有管理员权限
-
-- 创建用户并授予所有权限 CREATE USER 'admin'@'%' IDENTIFIED BY 'StrongPassword'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;-- 更安全的做法:授予特定管理权限 GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, RELOAD, PROCESS, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'admin'@'%';
-
*.*
:表示所有库所有表 -
WITH GRANT OPTION
:允许该用户授予权限给他人
-
-
如何查看用户的权限
-
-- 查看当前用户权限 SHOW GRANTS;-- 查看指定用户权限 SHOW GRANTS FOR 'user'@'host';-- 从系统表查询(需SUPER权限) SELECT * FROM information_schema.user_privileges WHERE GRANTEE LIKE "'user'@'host'";
-
-
能够创建一个只有固定权限的用户吗?比如只有某个表的权限,或者只有只读权限,又或者只有某个表中某行某列的权限
-
可以
#某张表权限 GRANT SELECT, INSERT ON dbname.table1 TO 'user1'@'%'; #只读权限 GRANT SELECT ON dbname.* TO 'readonly_user'@'%';
某列权限(MySQL 不支持精确到"某列"或"某行"权限,需用视图+触发器规避)
-
-
Mysql如何设计自动容灾与VIP漂移机制
-
自动容灾指主从切换 + 自动恢复,常见方案:
- MHA(Master High Availability)
- Orchestrator(自动切主)
- Keepalived + VIP
VIP漂移机制:
- VIP 绑定在主库
- 使用 Keepalived 检测主库健康
- 主库故障后 VIP 自动转移到新的主库
-
-
什么是脑裂,mysql如何防止脑裂,出现脑裂后如何处理
- 脑裂定义:集群中多个节点同时认为自己是主节点,导致数据不一致
- 防止脑裂:
- 使用 仲裁节点(如第三方监控节点)
- 使用 Paxos、Raft 等一致性协议(如在 MySQL Group Replication 中)
- 使用 自动切换工具(MHA、Orchestrator),限制只有一个主节点能接受写入
- 处理方法:
- 停止所有写操作
- 手动确认哪个主库保留
- 使用 binlog 或 GTID 做数据补偿和恢复
-
什么是连接池,是需要在应用层实现吗
-
接池:管理数据库连接的缓存池,避免频繁创建和销毁连接。主要功能包括:
- 连接复用,提高响应速度
- 连接数量限制,防止数据库过载
- 空闲连接回收,资源优化
实现位置:
- 推荐在应用层实现(如 Java 的 HikariCP、Python 的 SQLAlchemy 连接池)
- 也可使用中间件(如 Pgbouncer for PostgreSQL)
- 避免混用多层连接池,可能导致资源耗尽
-
在应用层实现:降低资源开销,提高性能,
控制最大并发连接数
-