整理自 MySQL实战45讲
鸟瞻图
长连接与短连接
数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接
短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个
建立连接的过程通常是比较复杂的,所以在条件允许的情况下尽可能使用长连接
但是全部使用长连接后,有些时候MySQL占用内存涨得特别快,这是因为MySQL在执行过程中临时使用的内存是管理在连接对象里面的
这些资源会在连接断开的时候才释放。所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是MySQL异常重启了
在MySQL5.7或更新版本,可以在每次执行一个比较大的操作后,通过执行mysql_reset_connection来重新初始化连接资源
这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态
查询缓存
查询缓存弊大于利,查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空
所以到MySQL8.0版本开始,直接将查询缓存的整块功能删掉了,也就是说8.0开始彻底没有这个功能了
宽松的 GROUP BY 和 时间格式
全局设置,重启mysql后失效
set global sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
全局设置,永久有效
[mysqld]
sql_mode ='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
查看空闲连接
show processlist
慢查询日志
[mysqld]
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 10
# 显示出慢查询日志中最慢的10条sql
mysqldumpslow -t 10 /usr/local/mysql/data/slow.log
TODO
即该 DDL 操作仅更改表的元数据信息,不用改变表中的实际记录,因此是可以瞬间完成的操作。
瞬间加列功能虽好,但是对于 DDL 操作的仅限于加列,对于索引添加、表的重整没有帮助。同时,还要求 MySQL 版本必须升级到 8.0.12 以上。
ALTER TABLE tbl_name
ADD COLUMN col_name column_definition
ALGORITHM = INSTANT
ClickHouse
MySQL、Redis、ES、MongoDB、Snowflake、ClickHouse、Aurora等。
权限设置
-- 创建用户
CREATE USER '用户名'@'%(可以访问的IP)' IDENTIFIED BY '密码';
-- 授权查看
grant select on 数据库.表名 to 用户名@'%'
-- 取消授权
REVOKE select on 数据库.表名 from 用户名@'%';
-- 查看用户有哪些权限
show grants for 用户名;
-- 立即生效
FLUSH PRIVILEGES;
JSON
windows切换MySQL存储路径到D盘
停止服务: services -> mysql80 -> 右键 -> 停止
复制: C:\ProgramData\MySQL\MySQL Server 8.0\Data -> D:\data\mysql_data\Data
修改my.ini: C:\ProgramData\MySQL\MySQL Server 8.0\my.ini -> 设置datadir=D:\data\mysql_data\Data
启动服务: services -> mysql80 -> 右键 -> 启动
Navicat导出向导
数据量较大时,可以使用导出向导按表导出SQL,不要右键转存为结构和数据
如果是直接从A环境迁移到B环境(不是备份SQL),直接用Navicat从A拖到B就行了
导出向导 -> sql脚本文件 -> 全选 -> 设置导出路径(全选那里有个下拉箭头,导出已选择的到相同文件) -> 下一步... -> 完成
查询schema
-- 查看表信息
SELECT * FROM `information_schema`.`TABLES`;
-- 查看视图信息
SELECT * FROM information_schema.VIEWS WHERE TABLE_NAME = 'v_test_xxx';