MySQL中一些基础查询操作(适用于MariaDB)(二)

 

 

 

1、查询mysql所有表的数据大小以及其他信息
SELECT 
	TABLE_NAME, 
	DATA_LENGTH, 
	INDEX_LENGTH, 
	(DATA_LENGTH+INDEX_LENGTH) AS length, 
	TABLE_ROWS, 
	CONCAT(ROUND((DATA_LENGTH+INDEX_LENGTH)/1024/1024,3), 'MB') AS total_size 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA='database_name' 
ORDER BY length DESC;

执行查询的结果如下:

说明:
TABLE_NAME :表名字;
DATA_LENGTH : 数据大小;
INDEX_LENGTH :索引大小;
TABLE_ROWS : 记录数量;
TABLE_SCHEMA : 数据库名字;
ENGINE:所使用的存储引擎;
information_schema :是mysql自带的,它提供了访问数据库元数据的方式,元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。

 

一个表占用空间的大小,相当于是 数据大小 + 索引大小;

  

2、备份表、分表:快速备份一张表的数据到另外一张表
### 备份表操作步骤

## 检查是否存在新表
DROP TABLE IF EXISTS tableName_20201010;

## 创建备份表
CREATE TABLE tableName_20201010 LIKE tableName;

## 查出数据并插入新表
INSERT INTO tableName_20201010 SELECT * FROM tableName;

测试效果:11W条记录,执行时间:2.048S

当然,可以使用这个作为分表的一个小技巧,例如按照月份来分表。

 

 3、分区:

  分区概念:

  分区是根据一定的规则,数据库把一个表分解成多个更小的、更容易管理的部分。就访问数据库应用而言,逻辑上就只有一个表或者一个索引,但实际上这个表可能有N个物理分区对象组成,每个分区都是一个独立的对象,可以独立处理,可以作为表的一部分进行处理。分区对应用来说是完全透明的,不影响应用的业务逻辑。

  分区版本支持: 

  + MySQL数据库在5.1版本时添加了对分区的支持。
  + 在MySQL 5.6里面,分区的信息是在MySQL Server层维护的(在.par文件里面),InnoDB引擎层是不知道有分区这个概念的,InnoDB引擎层把每一个分区都当成一张普通的InnoDB表。在打开一个分区表时,会打开很多个分区,打开这些分区表就相当于打开了同等数量的InnoDB表,这需要更多内存存放InnoDB表的元数据和各种与ibd文件打开相关的各种cache与handler的信息。
  + 在MySQL 5.7里面,InnoDB引入了Native Partitioning,它把分区的信息从Server层移到了InnoDB层,打开一个分区表和打开一个InnoDB表的内存开销基本是一样的。

  分区好处:

  分区有利于管理非常大的表,它采用分而治之的逻辑,分区引入了分区键的概念,分区键用于根据某个区间值(或者范围值)、特定值列表或者hash函数值执行数据的聚集,让数据根据规则分布在不同的分区中,让一个大对象碧昂城一些小对象。

  分区的对象:

  MySQL分区即可以对数据进行分区也可以对索引进行分区。

  分区类型:

  + range分区:基于一个给定的连续区间范围(区间要求连续并且不能重叠),把数据分配到不同的分区;常用分区类型。
  + list分区:类似于range分区,区别在于list分区是居于枚举出的值列表分区,range是基于给定的连续区间范围分区;常用分区类型。
  + hash分区:基于给定的分区个数,把数据分配到不同的分区。
  + key分区:类似于hash分区。
  + 子分区:

  注意:无论哪种分区,要么你分区表上没有主键/唯一键,要么分区表的主键/唯一键都必须包含分区键,也就是说不能使用主键/唯一键字段之外的其它字段分区。

  分表和分区的区别:

  + 水平分表需要用户预先手动显式创建出多张分表(如tbl_user0, tbl_user1, tbl_user2),在物理上实实在在的创建多张表,通过客户端代理(Sharding-JDBC等)或者中间件代理(Mycat等)来实现分表逻辑。

  + 分区是MySQL的一个插件Plugin功能,将一张大表的数据在数据库底层分成多个分区文件(如tbl_user#P#p0.ibd, tbl_user#P#p1.ibd, tbl_user#P#p2.ibd),和水平分表不同的是分区不需要显式的创建“分表”,数据库会自动创建分区文件的,用户看到的只是一张普通的表,其实是对应的是多个分区,这个是对用户是屏蔽的、透明的,在使用上和使用一张表完全一样,不需要借助任何功能来实现。分区是一种逻辑上的水平分表,在物理层面还是一张表。

 

 

 

 

 

 
 
 
  创建分区时出现的错误记录:
  【ERROR 1064 (42000): Partitioning can not be used stand-alone in query near】
  翻译为:不能单独创建分区,创建分区时要创建分区表。
  解决方案:分区不能单独创建,在建表的时候就要创建一个分区表。
 
  【ERROR 1564 (HY000): This partition function is not allowed】
  翻译为:分区不支持此函数。分区不支持此函数。
  解决方案:目前支持的分区函数有如下,根据版本查找即可找到相对应的官方文档
  V5.1:http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-functions.html
  V5.5:http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-functions.html
  V5.6:http://dev.mysql.com/doc/refman/5.6/en/partitioning-limitations-functions.html
  V5.7:https://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations-functions.html
  V8.0:https://dev.mysql.com/doc/refman/8.0/en/partitioning-limitations-functions.html
 
 
 
 
 
 
posted @ 2020-10-10 09:53  一世尘梦(Aion)  阅读(139)  评论(0编辑  收藏  举报