zoukankan      html  css  js  c++  java
  • 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
     
     
     
     
     
     
  • 相关阅读:
    ASP.NET(C#)图片加文字、图片水印
    CMake构建Visual Studio中MFC项目的Unicode问题
    用Visual Studio 2008(VS)编译WebKit的r63513
    此时学习中
    ASP.NET进阶——初学者的提高(长期)
    继续努力
    程序员阿士顿的故事
    iOS 深拷贝和浅拷贝
    Javascript中this的取值
    Lisp的本质(The Nature of Lisp)
  • 原文地址:https://www.cnblogs.com/yuchuan/p/mysql_base_3.html
Copyright © 2011-2022 走看看