1. processlist
功能:查看连接数
注意:自己创建连接 一定要关闭连接!!
现在项目都用数据源 这个基本不用自己管(DBCP,c3p0,Druid(https://github.com/alibaba/druid),HiKariCP)
字段说明
- List item
- id : sessionId
- user:操作用户
- host:操作主机 端口
- db: 操作的数据库
- command: 表示命令类型
- info:表示详细的sql语句
- time:表示相应命令执行时间
- state:表示命令执行状态
schema 与数据类型优化
1. 数据类型的优化
-
更小的通常更好
他们占用更少的磁盘、内存、cpu缓存
并且处理时cpu周期更少
但是需要注意 不要低估数据存储值的范围(字段过小会截断错误)
可以设置不同的类型 插入数据测试(数据存储大小直接看数据文件 )windows环境下 mysql的data 目录下
frm后缀是表结构idb后缀是数据文件 idb 引擎就是 innoDB
如果不是idb 是MYD MYI 引擎就是MyISAM
MYD 是数据文件 MYI是索引文件 简单就好
简单数据类型的操作,通常更少的数据周期
- 整型比字符串操作代价更低 因为字符集和校对规则 字符串比整型更复杂
- 使用mysql自建类型 而不是字符串 存储日期和时间
- 用整型存储IP INET_ATON(‘192.168.2.1’) – > 数字
- INET_NTOA(数字) --> IP地址
尽量避免使用NULL
- 如果查询中包含null的列,对mysql来说很难优化
- 因为null使得索引、索引统计、和值的比较更加复杂
- null 改为not null 性能提升比较小 所以没必要都改 只是在设计的时候注意 尽可能不为null
实际细则
char
varchar 根据实际内容长度保存数据
TEXT BLOB
MySQL 会把每个BLOB 和 TEXT 当做一个对象来独立处理
两者都是为了存储很大数据而设计的字符串类型
Text 存储字符串
Blob 存储二进制datetime
timestarmp
date
-
用枚举类型替代字符串
-- 创建表 create table enum( id enum('aaa','bbb','ccc') not null )-- 插入数据insert into enum(id)values ('aaa')insert into enum(id)values ('bbb'),('ccc')-- 查询 结果虽然是aaa bbb cccselect * from enum -- 结果是1 2 3 他是整形数据存储的select 0+id from enum-- 排序 与创建表的时候 定义的顺序有关系 按照定义顺序来的 select id from enum order by id;
字段最好指定长度
- 固定长度
- 最大长度255
- 会自动删除末尾空格
- 检索效率、写效率 比varchar高 以空间换时间
- 应用场景:
a. 存储长度波动不大的数据 如:md5摘要
b.存储短字符串 经常更新的字符串
- 使用最小符合需求的长度
- varchar(n) n<255 使用额外一个字节保存长度
n>255 使用额外两个字节保存长度 - varchar(5) 和 varchar(255) 保存同样的内容
硬盘存储空间是一样的,但是内存空间占用不同,是指定的大小
- varchar在5.6之前 变更长度 或者从255一下变更到255以上之后 就会导致锁表
- 应用场景:
a.存储长度波动比较大的数据 比如文章
b. 字符串很少更新的场景,内次更新后都会重算并使用额外存储空间保存长度
c.适合保存多字节字符 汉字 特殊字符 等
- 占用8个字节
- 与时区无关 数据库底层时区配置 对datetime无效
- 可保存到毫秒
- 可保存事件范围大
- 不要使用字符串存储日期 (占用空间大 损失日期类型函数的便捷性)
- 占用4字节
- 时间范围1970-01-01 到 2038-01-19
- 精确到秒
- 采用整形存储
- 依赖数据库设置时区
- 自动更新timestarmp列的值
- 占3个字节
- 使用date类型 还可以利用日期时间函数进行日期之间的计算
- date类型用于保存 1000-01-01 到 9999-12-21之间的日期
- TYNYINT (8位存储空间)
- SMALLINT(16位存储空间)
- MEDIUMINT(24位存储空间)
- INT(32位存储空间)
- BIGINT(64位存储空间)
- 整数类型 (尽可能满足需求最小的数据类型)
- 字符 & 字符串类型