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 存储毫秒数,然后自行转换。

相关推荐
xiaoyalian1 小时前
R语言绘图过程中遇到图例的图块中出现字符“a“的解决方法
笔记·r语言·数据可视化
Red Red2 小时前
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网络·笔记·学习·安全·web安全
mqiqe3 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
工业甲酰苯胺3 小时前
MySQL 主从复制之多线程复制
android·mysql·adb
BestandW1shEs3 小时前
谈谈Mysql的常见基础问题
数据库·mysql
贰十六3 小时前
笔记:Centos Nginx Jdk Mysql OpenOffce KkFile Minio安装部署
笔记·nginx·centos
重生之Java开发工程师3 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql
教练、我想打篮球3 小时前
66 mysql 的 表自增长锁
数据库·mysql
Ljw...3 小时前
表的操作(MySQL)
数据库·mysql·表的操作