MySQL学习笔记

1. 查看执行SQL语句所用的时间

sql 复制代码
-- 启用 profile
SHOW VARIABLES LIKE 'profiling';
SET profiling = 1;
-- 使用 show profiles 查看SQL语句执行的信息
SHOW PROFILES;
SHOW PROFILE FOR QUERY 3;

-- 查询某个SQL语句的详细信息,并按照耗时排序
SET @query_id = 3;
SELECT STATE, SUM(DURATION) AS Total_R,
	ROUND(
	100 * SUM(DURATION) / (
		SELECT SUM(DURATION) FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID = @query_id
    ), 2) AS Pct_R,
    COUNT(*) AS Calls,
	SUM(DURATION) / COUNT(*) AS "R/Call"
FROM INFORMATION_SCHEMA.PROFILING
WHERE QUERY_ID = @query_id
GROUP BY STATE
ORDER BY Total_R DESC;

-- 查看计数
SHOW GLOBAL STATUS;
SHOW STATUS WHERE Variable_name LIKE 'Handler%' OR Variable_name LIKE 'Created%';
SHOW PROCESSLIST;

SHOW TABLE STATUS LIKE 'user';

2. 数据类型

官方文档:Data Types

2.1 整数

MySQL支持的整数类型有 TINYINTSMALLINTMEDIUMINTINTBIGINT,分别使用8、16、24、32、64位存储空间,可使用 UNFIGNED 设置为无符号整数。

MySQL可以为整数类型指定宽度,例如 INT(11),对大多数应用这是没有意义的,它不会限制值的合法范围,只是规定了MySQL的一些交互工具(例如MySQL命令行客户端)用来显示字符的个数,对于存储和计算来说,INT(1) 和 INT(20) 是相同的。

2.2 实数

MySQL支持的实数类型有 FLOATDOUBLEDECIMAL,FLOAT 使用4个字节存储,DOUBLE 使用8个字节存储,DECIMAL只是一种存储格式,在计算时 DECIMAL 会转成 DOUBLE 类型,MySQL5.0及以上版本,DECIMAL 是每4个字节存9个数字,例如 DECIMAL(18, 9) 小数点两边各存储9个数字,一共使用9个字节:小数点前面的数字用4个字节,小数点后面的数字用4个字节,小数点本身使用1个字节。

因为需要额外的空间和计算开销,所以应该尽量只在需要对小数进行精确计算时才使用 DECIMAL(比如存储财务数据)。在数据比较大的时候,可以考虑使用 BIGINT 代替 DECIMAL,把需要存储的小数乘以相应的倍数即可,这样可以同时避免浮点存储计算不精确和 DECIMAL 精确计算代价高的问题。

2.3 字符串

MySQL支持的字符串类型有 VARCHARCHARTEXT,VARCHAR用于存储长度不定的字符串,CHAR用于存储长度固定的字符串(如设备MAC地址),TEXT 用于存储长度很大的字符串。字符串的存储方式跟存储引擎有关,下面描述的是 InnoDB 的实现:

2.3.1 VARCHAR

VARCHAR 需要使用1个或2个字节存储字符串长度(注意是字符个数,不是字节数,所以长度和使用的字符集有关),假设使用 Latin1 字符集,VARCHAR(10) 需要11字节的存储空间,而 VARCHAR(1000) 则需要 1002 字节的存储空间。

相比于 CHAR 类型,存储长度不定的字符串,VARCHAR 可以节省空间,但更新数据时可能需要额外的工作,造成数据存储的碎片化,所以如果需要频繁更新该列,碎片化是个问题。

总结一下就是,VARCHAR 适用的场景是:字符串列的最大长度比平均长度大很多;列的更新很少;使用了UTF-8 这样的字符集,每个字符使用不同的字节进行存储。

2.3.2 CHAR

CHAR类型是定长的,MySQL总是根据定义的长度分配足够的空间,当存储 CHAR 值时,MySQL会删除末尾的所有空格,CHAR值会根据需要使用空格进行填充以方便比较。

CHAR适合存储很短的字符串,或者所有值都接近同一个长度的字符串。对于经常变更的数据,CHAR 也比 VARCHAR 更好,因为没有碎片化问题。对于非常短的列,CHAR 比 VARCHAR 使用更小的存储空间,例如只有 'Y' 和 'N' 的值,用 CHAR(1) 存储仅用1个字节,而 VARCHAR 要用2个字节。

2.3.3 TEXT

TEXT 用于存储长度很大的字符串,包括 TINYTEXTSMALLTEXTTEXTMEDIUMTEXTLONGTEXT, TEXT 和 SMALLTEXT是一样的。

2.4 二进制

MySQL支持的二进制类型有 BINARYVARBINARYBLOB, 他们的区别与CHAR、VARCHARTEXT 类似,只不过存储的是二进制数据,BLOB 用于存储很大的数据,如图片,包括 TINYBLODSMALLBLODBLODMEDIUMBLOBLONGBLOB,BLOB 和 SMALL BLOB 是一样的。

2.5 枚举

枚举本质上把一组字符串映射成一组数字,可以节省一些存储空间,但在查询时有额外的开销:把数字转成对应的字符串。

2.6 日期和时间

DATETIME 使用8个字节,存储为 yyyyMMddHHmmss 格式的整数,与时区无关,看得出,这种方式可以到 9999 年。

TIMESTAMP 使用4个字节,存储的是 1970-01-01 00:00:00 以来的秒数,也叫Unix时间戳,其显示的值依赖时区,这种方式只能到 2038 年。MySQL提供了两个函数转换Unix时间戳和日期,FROM_UNIXTIME() 把Unix时间戳转成日期字符串,UNIX_TIMESTAMP() 把日期字符串转成Unix时间戳。

如果需要存储精确到毫秒的日期和时间,可以使用 BIGINT 存储毫秒数,然后自行转换。

相关推荐
云计算练习生2 小时前
理解MySQL核心技术:存储过程与函数的强大功能
数据库·mysql·存储过程·函数·mysql函数
st紫月3 小时前
用MySQL+node+vue做一个学生信息管理系统(四):制作增加、删除、修改的组件和对应的路由
前端·vue.js·mysql
程序员鱼皮5 小时前
MySQL 9.0 创新版发布,大失所望。。
数据库·mysql·计算机·程序员·编程
skyshandianxia5 小时前
Java面试八股之如何提高MySQL的insert性能
java·mysql·面试
穷苦书生_万事愁5 小时前
如何在Oracle、MySQL、PostgreSQL中改变SQL提示格式
mysql·postgresql·oracle
十年一梦实验室5 小时前
【C++】相机标定源码笔记- 标定工具库测试
笔记·数码相机
helloKittywz5 小时前
内网学习第6天 liunx定时任务 环境变量和权限配置,以及数据库提权
学习·web安全·网络安全·内网渗透·liunx·权限提升·学习记录
jerry-895 小时前
MySql中每行多值属性的计数值
大数据·数据库·mysql
炫酷的伊莉娜6 小时前
【网络安全】第3讲 消息认证技术(笔记)
笔记·安全·web安全
Lyx-06076 小时前
项目进度管理(信息系统项目管理师)
笔记