数据持久化 -- 数据库性能分析命令
一、查看数据库表占用空间大小
1 | select TABLE_NAME,concat(truncate((DATA_LENGTH+INDEX_LENGTH)/1024/1024,2),'M'),TABLE_ROWS FROM information_schema.TABLES where TABLE_SCHEMA='ins_rank' |
上面的语句会依次输出ins_rank数据库中表对空间占用的情况,单位是M,来一一解释关键字和函数的意义
函数
concat函数–联合字段
1
2<!--这个函数的作用就是将两个字段拼接到一个字段中做显示-->
select concat(10,'M') as lengeround()–四舍五入,虽然这里没有用到,还是可以留个印象,MySQL里面有这么个函数
1
2select round(column_name,decimals) from table_name
# 这里decimals表示精确度,返回小数点后几位truncate()–截取字段函数,案例中使用了truncate就没有使用round
1
2
3
4
5
6
7
8
9
10
11
12truncate(X,D)
# 这里的X是要做处理的数据
# 这里的D表示对数据处理的方式
# 案例一:D小于0
select truncate(123.456,-2)
结果:100
# 案例二:D等于0
select truncate(123.456,0)
结果:123
# 案例二:D大于0
select truncate(123.456,2)
结果:123.45
关键字
在介绍关键字之前说另一个东西,关于数据库表的一些信息像是空间占用、记录行数、更新时间、字段等都在informatioin_schema数据库中的TABLES表里面有记录,所以上面的语句是从这个地方去做的一个查询
- TABLE_SCHEMA : 数据库名
- TABLE_NAME:表名
- ENGINE:所使用的存储引擎
- TABLES_ROWS:记录数,即表的行数
- DATA_LENGTH:数据大小
- INDEX_LENGTH:索引大小
- CREATE_TIME:创建时间
- UPDATE_TIME:最近更新时间
二、查看SQL语句执行详情
EXPLAIN
1 | EXPLAIN select * from ins_kol where id = 100000 |
输出结果:
- id是该sql在执行序列中的编号,这里只有一句所以就没什么意义了,id值越大,优先级越高
- select_type:查询类型
- SIMPLE:简单的 select 查询,不使用 union 及子查询
- PRIMARY:最外层的 select 查询
- UNION:UNION 中的第二个或随后的 select 查询,不 依赖于外部查询的结果集
- DEPENDENT UNION:UNION 中的第二个或随后的 select 查询,依 赖于外部查询的结果集
- SUBQUERY:子查询中的第一个 select 查询,不依赖于外 部查询的结果集
- DEPENDENT SUBQUERY:子查询中的第一个 select 查询,依赖于外部 查询的结果集
- DERIVED:用于 from 子句里有子查询的情况。 MySQL 会 递归执行这些子查询, 把结果放在临时表里。
- UNCACHEABLE SUBQUERY:结果集不能被缓存的子查询,必须重新为外 层查询的每一行进行评估。
- UNCACHEABLE UNION:UNION 中的第二个或随后的 select 查询,属 于不可缓存的子查询
- table:查询指向的表
- partitions:这个应该是由于这里的表做了分区才有了这个参数,表示数据最后是落在哪个分区中的
- type:表的连接类型
- system:表中只有一行,即常量
- const:单表中最多有一个匹配行,如primary key或unique index
- eq_ref: 对于前面的每一行,在此表中只查询一条记录,也就是多表连接中使用primary key或unique index
- ref: 与eq_ref类似,区别在于不是使用primary key或unique index,而是使用普通索引
- ref_or_null: 与ref类型,区别在于条件中包含对null的查询
- index_merge: 索引合并优化
- unique_subquery: in的后面是一个查询主键字段的子查询
- index_subquery: 与unique_subquery类似,区别在于in的后面是查询非唯一索引字段的子查询
- range: 单表中的范围查询
- index: 对于前面的每一行,都通过查询索引来得到数据
- all: 对于前面的每一行,都通过扫描全表来得到数据
- (一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题)
- possible_keys: 查询时可能用到的索引
- key: 查询时实际使用到的索引,如果没有选择索引,键是NULL
- key-len: 索引字段的长度 如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好
- rows: 扫描行的数量
- Extra: 执行情况的说明和描述 也是关键参考项之一,但是这里没有遇到再补充
show profiles查看执行时间
1 | <!--查看数据库版本,大概要5.0之后的版本才支持这个功能--> |
