一、查看数据库表占用空间大小

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 lenge
  • round()–四舍五入,虽然这里没有用到,还是可以留个印象,MySQL里面有这么个函数

    1
    2
    select round(column_name,decimals) from table_name
    # 这里decimals表示精确度,返回小数点后几位
  • truncate()–截取字段函数,案例中使用了truncate就没有使用round

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    truncate(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
2
3
4
5
6
7
8
9
10
11
12
13
<!--查看数据库版本,大概要5.0之后的版本才支持这个功能-->
show variables like "%version%"
<!--功能默认是关闭的,查看状态-->
show variables like "%pro%"
<!--激活这个功能,重启之后会失效,所以最好每次都检查一下状态-->
set profiling = 1
<!--查询语句-->
select * from ins_insight_user where id = 1000
select * from ins_kol where id = 100000
<!--查看刚才执行的SQL用时信息-->
show profiles
<!--查看第一条语句各个操作的用时情况-->
show profile for query 1