整理自 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脚本文件 -> 全选 -> 设置导出路径(全选那里有个下拉箭头,导出已选择的到相同文件) -> 下一步... -> 完成

results matching ""

    No results matching ""