精华内容
下载资源
问答
  • Mysql数据结构

    千次阅读 2019-12-09 17:41:32
    文章目录数据页数据库中的存储结构数据页的结构数据结构的角度看B+树结构-决定特性磁盘IO数据库缓冲池缓冲池的一些命令查看数据页加载的三种方式结构-决定特性 数据页 数据库中的存储结构 记录是按照行来存储的...

    数据页

    数据库中的存储结构

    记录是按照行来存储的,但是数据库的读取并不以行为单位,在数据库中,不论读一行,还是读多行,都是将这些行所在的页进行加载。也就是说,数据库管理存储空间的基本单位是页(Page)。

    一个页中可以存储多个行记录(Row),同时在数据库中,还存在着区(Extent)、段(Segment)和表空间(Tablespace)。行、页、区、段、表空间的关系如下图所示:
    在这里插入图片描述
    页(Page):用来存储数据表达形式行的空间,一页可以存在多个行,每一种数据库或数据引擎对于页的大小定义是不一样的,Sql Server的页大小为8K,、Oralce 支持的块大小为 2KB,4KB,8KB,16KB,32KB 和 64KB、InnoDB为16K。
    区(Extent):是比页大一级的我存储结构,在InnoDB引擎中,一个区会分配64个连续的页,不同的引擎上的页默认大小不一致,在InnoDB默认大小为16KB,一个区的大小也就是1M
    段(Segment):是由一个区或多个区组成,段并不需要区是连续的,段是数据库的分配单位,创建表的时候会创建一个表段,创建一个索引的时候会创建一个索引段。
    表空间(Tablespace):是一个逻辑容器,表空间是由段或多个段组成,对应的关系是一对多的关系,数据库是由一个表空间或多个表空间组成,从管理上可以划分为系统表空间、用户表空间、临时表空间等。

        在 InnoDB 中存在两种表空间的类型:共享表空间和独立表空间。如果是共享表空间就意味着多张表共用一个表空间。如果是独立表空间,就意味着每张表有一个独立的表空间,也就是数据和索引信息都会保存在自己的表空间中。独立的表空间可以在不同的数据库之间进行迁移

    数据页的结构

    在这里插入图片描述
    数据库IO的操作的最小单位为页,数据页的结构可以分为三部分

    • 1、文件通用部分:文件头和文件尾
          文件头:文件头中有两个字段FIL_PAGE_PREV 和 FIL_PAGE_NEXT它们的作用相当于指针,分别指向上一个数据页和下一个数据页,连接起来的页相当于一个双向的链表,采用链表的结构让数据页之间不需要是物理上的连续,而是逻辑上的连续。在页里面,记录之间采用的单向链表的方式
          文件尾:文件尾的校验方式就是采用 Hash 算法进行校验,通过文件尾的校验和(checksum 值)与文件头的校验字段值和做比对,如果两个值不相等则证明页的传输有问题,需要重新进行传输,否则认为页的传输已经完成。

    • 2、记录部分:
      在这里插入图片描述
      页的主要作用是存储记录,所以“最小和最大记录”和“用户记录”部分占了页结构的主要空间。另外空闲空间是个灵活的部分,当有新的记录插入时,会从空闲空间中进行分配用于存储新记录

    • 3、索引部分:
          这部分重点指的是页目录,它起到了记录的索引作用,因为在页中,记录是以单向链表的形式进行存储的。单向链表的特点就是插入、删除非常方便,但是检索效率不高,最差的情况下需要遍历链表上的所有节点才能完成检索,因此在页目录中提供了二分查找的方式,用来提高记录的检索效率。
          首先针对链表进行数据分组,总共存在三种分组情况第一组、最后一组、其他组,第一组的数量只会有一条记录、最后一组是记录数最大的一组会有1-8条记录,其他组会尽量平均在4-8条之间,每个组的最后一条记录的头部信息会存储着该组的纪录数,而页的页目录空间根据最后一条记录的做地址偏移量,这些地址偏移量被称为槽(slot),每个槽相当于指针指向不同组的最后的一个记录,最终根据槽做二分查找,可以取到我们的内容。

    从数据页结构的角度看B+树

    数据页的角度看 B+ 树是如何进行查询
        一棵 B+ 树中,每个节点都是一个页,每次新建节点的时候,就会申请一个页空间。同一层上的节点之间,通过页的结构构成一个双向的链表(页文件头中的两个指针字段)。非叶子节点,包括了多个索引行,每个索引行里存储索引键和指向下一层页面的页面指针。最后是叶子节点,它存储了关键字和行记录,在节点内部(也就是页结构的内部)记录之间是一个单向的链表,但是对记录进行查找,则可以通过页目录采用二分查找的方式来进行。
    B+ 树是如何进行记录检索的
        通过 B+ 树的索引查询行记录,首先是从 B+ 树的根开始,逐层检索,直到找到叶子节点,也就是找到对应的数据页为止,将数据页加载到内存中,页目录中的槽(slot)采用二分查找的方式先找到一个粗略的记录分组,然后再在分组中通过链表遍历的方式查找记录。

    结构-决定特性

    磁盘IO

        前提InnoDB的索引本质是B+Tree,对于一棵B+Tree的索引树来说,查找数据是需要从根节点一直找到子节点,而从磁盘的角度上看,就是需要先将数据所在的页读入到内存上,再在内存中对页里面的用户记录空间上进行查找,这样来说尽管你只需要页上面的一条记录,对于磁盘来说,也是需要加载整页的数据,这点很关键。

    数据库缓冲池

        磁盘IO需要消耗的时间很多,因此为了能让数据表或索引中的数据能随时让我们取用,DBMS会申请占用内存来做为数据的缓冲池,尽量减少磁盘的活动,这种策略对于提升sql的查询性能至关重要。首先我们先看下缓冲池是如何工作的。
    在这里插入图片描述
        服务器发起sql查询,经过引擎的优化器以及执行计划分析后通过查询执行器直接惊险该数据库的访问,在访问的过程中,缓冲池管理器会尽量将经常使用的数据保存起来,在数据库进行页面读操作的时候,首先会判断该页面是否在缓冲池中,如果存在就直接读取,如果不存在,就会通过内存或磁盘将页面存放到缓冲池中再进行读取。
        对于缓冲池上的数据的更新,首先会修改缓冲池中页里面的记录信息,然后数据库会以一定的频率刷新到磁盘上。这个处理并不是实时性的,为了数据库的整体性能,缓冲池会采用checkpoint的机制将数据回写到数据库中。当缓冲池不够用时,需要释放掉一些不常用的页,就可以采用强行采用 checkpoint 的方式,将不常用的脏页回写到磁盘上,然后再从缓冲池中将这些页释放掉。这里脏页(dirty page)指的是缓冲池中被修改过的页,与磁盘上的数据页不一致。

    缓冲池的一些命令查看

    MySQL MyISAM 存储引擎,它只缓存索引,不缓存数据;InnoDB引擎可以通过命令进行查看。
    查看缓冲池的大小
    mysql > show variables like ‘innodb_buffer_pool_size’
    查看缓冲池的个数(大小参数设置为大于等于 1GB,缓冲池个数会大于1个)
    mysql > show variables like ‘innodb_buffer_pool_instances’

    数据页加载的三种方式

    决定性能跟缓冲池的读取方式息息相关

    1. 内存读取
      如果该数据存在于内存中,基本上执行时间在 1ms 左右,效率还是很高的。
    2. 随机读取
      如果数据没有存在内存中,那么需要在磁盘中对页进行查找,单个页的时间预估为10ms左右,其中分为磁盘的寻道和半圈旋转时间、排队时间以及传输时间。面对大批量的情况下还是通过顺序读取的方式来提高整体的性能。
    3. 顺序读取
      顺序读取实质上是一种批量读取的方式,因为我们请求的数据一半多是相邻存储的,这就允许我们使用批量读取页,一次性加载到缓冲池上,不需要单独的磁盘IO操作。如果一个磁盘的吞吐量是 40MB/S,那么对于一个 16KB 大小的页来说,一次可以顺序读取 2560(40MB/16KB)个页,相当于一个页的读取时间为 0.4ms。采用批量读取的方式,即使是从磁盘上进行读取,效率也比从内存中只单独读取一个页的效率要高。

    查看查询优化器的成本,在查询语句后执行知道大概需要多少页的查询量
    mysql> SHOW STATUS LIKE ‘last_query_cost’;

    结构-决定特性

    数据库Down掉之后的Recover,只能是用最新对backup+checkpoint+transaction的log 恢复,就是因为commit的内容还没有从缓冲池写入磁盘。

    展开全文
  • mysql数据结构

    千次阅读 2018-12-31 22:52:17
    在刚才新建表的过程中,我们提到了数据类型,MySQL数据类型和其他编程语言大同小异,下表是一些 MySQL 常用数据类型: 整数型:整数除了 INT 外,还有 TINYINT、SMALLINT、MEDIUMINT、BIGINT。 字符型:CHAR 和 ...

    在刚才新建表的过程中,我们提到了数据类型,MySQL 的数据类型和其他编程语言大同小异,下表是一些 MySQL 常用数据类型:

    在这里插入图片描述

    整数型:整数除了 INT 外,还有 TINYINT、SMALLINT、MEDIUMINT、BIGINT。

    字符型:CHAR 和 VARCHAR 的区别: CHAR 的长度是固定的,而 VARCHAR 的长度是可以变化的,比如,存储字符串 “abc",对于 CHAR(10),表示存储的字符将占 10 个字节(包括 7 个空字符),而同样的 VARCHAR(12) 则只占用4个字节的长度,增加一个额外字节来存储字符串本身的长度,12 只是最大值,当你存储的字符小于 12 时,按实际长度存储。

    枚举型:ENUM和SET的区别: ENUM 类型的数据的值,必须是定义时枚举的值的其中之一,即单选,而 SET 类型的值则可以多选。

    你已经注意到了,有的数据需要用单引号括起来,比如 Tom、Jack、Rose 的名字,这是由于它们的数据类型是 CHAR 型。此外VARCHAR,TEXT,DATE,TIME,ENUM 等类型的数据也需要单引号修饰,而 INT,FLOAT,DOUBLE 等则不需要。

    展开全文
  • Mysql数据结构 - 时间和日期

    千次阅读 2017-09-18 20:24:14
    Mysql数据结构 - 时间和日期日期和时间值可以以多种格式表示,例如引用的字符串或数字,具体取决于值的确切类型和其他因素。 例如,在上下文中,其中的MySQL预计日期时,它可以把任何的类似于 '2015-07-21','...

    Mysql数据结构 - 时间和日期

    日期和时间值可以以多种格式表示,例如引用的字符串或数字,具体取决于值的确切类型和其他因素。 
    例如,在上下文中,其中的MySQL预计日期时,它可以把任何的类似于
    '2015-07-21''20150721'以及20150721作为一个日期。

    1.通过时间类型关键字指定时间

    DATE '2017-07-07'
    TIME '15:15:15'
    TIMESTAMP '2017-07-07 15:15:15'

    2.通过字符串和数字来代表日期和时间

    1.如果是一个'YYYY-MM-DD'或 任何'YY-MM-DD'格式的字符串。允许使用快速语法:
        任何标点符号可用作日期部分之间的分隔符。例如,'2012-12-31''2012/12/31''2012^12^31',
        和 '2012@12@31'是相等的。
    2.如果是一个没有分隔符的字符串,不管是 格式'YYYYMMDD'还是'YYMMDD'格式,只要字符串是有意义的日期就行。
        例如,'20070523''070523'被转化为 '2007-05-23',但是 '071332'是非法的(它有无意义的月和日)
        他最终的值会变为 '0000-00-00'3.如果是一个数字YYYYMMDD或 YYMMDD格式,只要数字是有意义的日期。
        例如, 19830905830905 转化为'1983-09-05'
    4.如果是一个'YYYY-MM-DD HH:MM:SS'或任何'YY-MM-DD HH:MM:SS'格式的字符串。
        也允许使用快速语法:任何标点符号可用作日期部分或时间部分之间的分隔符。
        和 '2012@12@31 11^30^45'是相等的。
    5.如果秒数后面要带毫秒,那么,只能以小数点分隔
        例如:2017-09-18 201615.500
        他的最高精度可以精确到微妙,也就是百万分之一秒。
    
    // 特殊规则
    // 如果年份只使用两位数,mysql会按照以下的规则进行解析
    // 年份值70-99转换为1970-1999
    // 年份值00-69转换为2000-2069
    6.自动补0
        mysql不强制时间前强制补0,比如 2017-07-07 05:03:042017-7-7 534是等同的
    
    展开全文
  • Mysql数据结构同步工具

    千次阅读 2020-05-02 20:35:48
    一般来说新项目就是把本地数据库直接导出到生产环境即可,但是后续的维护在数据结构同步上就稍显麻烦, 因此就有了这个项目的由来分享一个自己开发的小工具,方便进行两个数据库之间的同步,废话不多说直接进入正题...

    一直从事软件网站系统开发工作,经常要在本地开发完成后,同步数据库结构到服务器端,

    一般来说新项目就是把本地数据库直接导出到生产环境即可,但是后续的维护在数据结构同步上就稍显麻烦,

    因此就有了这个项目的由来分享一个自己开发的小工具,方便进行两个数据库之间的同步,废话不多说直接进入正题,

    下载dbsync工具包 https://download.csdn.net/download/weixin_36441117/12382401 (支持下赚点资源分谢谢)

    压缩包内有个bin文件夹,其中找到对应的版本

    压缩包文件目录及对应的版本说明如下

    /bin

    /bin/386/windows      如果是32位Windows系统请使用本文件夹下的dbsync.exe

    /bin/386/linux             如果是32位Linux系统请使用本文件夹下的dbsync

    /bin/amd64/windows 如果是64位Windows系统请使用本文件夹下的dbsync.exe

    /bin/amd64/linux             如果是64位Linux系统请使用本文件夹下的dbsync

    /bin/arm64                  应该没有arm嵌入式设备的用户吧,忽略此目录

     

    找到对应的执行文件,放到与跟文件加下的config.json相同目录下,如下图

     

    打开命令行工具到对应的目录下,并且执行dbsync如下图

    为了方便使用先看下config,json文件如何配置

    {
    	"configure":{
    		"UseLogFile" : false     //是否启用日志文件
    		,"LogLevel" : 0          //日志等级0:除错模式 1.提醒 2.讯息 3.错误 4.致命错误
    		
    	},
    	"source_db":{             //这里设置来源的数据库,如果使用xml模式可不设置
    			"driver":"mysql"
    			,"host":"192.168.26.1"
    			,"port":"3306"
    			,"user":"test"
    			,"password":"123456"
    			,"dbname":"test"
    			,"charset":"utf8"
    	},
    	"target_db":[            //这里设置目标数据库,注意是数组,可以设置多个目标
    		{
    			"driver":"mysql"
    			,"host":"192.168.26.1"
    			,"port":"3306"
    			,"user":"test"
    			,"password":"123456"
    			,"dbname":"test1"
    			,"charset":"utf8"
    			,"definer":"test@localhost"
    		}	
    	],
    	"data_sync":[   //这里设置需要数据同步的表跟相对应的字段
    		{
    			"table_name" : "config"
    			,"key_field" : "name,site_uid"
    			,"exclude_field" : ["cfg_id"]
    		},
    		{
    			"table_name" : "menu"
    			,"key_field" : "mid"
    			,"exclude_field" : []
    		}
    	
    	],
    	"scp_remote" :{  //这里设置的使用SCP上传的ssh设置
    		"host" : "1.2.3.4"
    		,"port" : 22
    		,"username" : "root"
    		,"password" : ""
    	}
    	
    	
    }

    (1) source_db 是设置数据库的结构来源,如果使用库对库结构同步,

    或者将数据库结构导出成XML文件时,需要设置此部分

    (2)target_db 是用来将结构同步到那些数据库,所以注意这里是个数组,每个目标服务器是对象

    (3)data_sync 这个设置要特别说一下,因为我们可能除了数据结构需要同步以外,有可能有一些数据也需要同步,

    例如菜单表,可能我们系统增加功能之后,也需要在目标库中去新增对应的菜单,如下

    
    		{
    			"table_name" : "menu"
    			,"key_field" : "mid"
    			,"exclude_field" : []
    		}

    菜单表的表名为menu,然后为了判断该数据目标数据库是否有重复,所以需要指定 key_field如果目标表,

    已经有相同的mid时就不插入该条数据,再看一个例子

    		{
    			"table_name" : "config"
    			,"key_field" : "name,site_uid"
    			,"exclude_field" : ["cfg_id"]
    		},
    

    我项目中还有一个环境变量配置表,这张表的目的是项目中,经常需要一些环境配置,这些配置是直接由数据表来生成,

    配置的表单的,这张数据表的pk字段是cfg_id,但是因为本地的id可能跟线上不同,另外因为我们的项目是多用户系统,

    每个站点使用site_uid来区分,每个变量都是使用 name 这个字段来区分不同变量,因此在数据同步的时候,使用了

    "name,site_uid"来判断目标库里是否有相同数据,但是在插入数据的时候要忽略这张表本身的cfg_id主键字段以免重复

    (4)scp_remote 为了方便我们经常需要将本地的数据库结构导出成XML文件并且上传到服务器,

    因此提供了一个快速的上传命令,这里是配置远端的服务器的SSH设置使用此设置透过scp来上传

    当配置完成来看下如何使用吧,命令特别简单

     

    直接库对库的结构同步

    D:\dbsync_v1.7>dbsync.exe sync

    如果要将来源数据库结构导出XML文件,导出成 schema.xml

    D:\dbsync_v1.7>dbsync.exe export

    如果要将XML同步到目标数据库

    D:\dbsync_v1.7>dbsync.exe xsync

    将本地的文件透过SCP上传服务器

    D:\dbsync_v1.7>dbsync.exe upload schema.xml /home/yang/

    如有问题欢迎留言反馈

    展开全文
  • Mysql数据结构及算法原理

    万次阅读 2018-04-06 21:01:42
    摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,...
  • PowerDesigner导出mysql数据结构

    千次阅读 2018-11-28 16:31:21
    好久没有使用PowerDesigner,突然想用它导出数据结构,居然忘记了。当时印象很深刻的配置了半天才搞成功,由于没有没有做笔记,忘得几乎是一干二净。因此在网上找了几篇文章转载,仅供作为笔记使用。以后如果时间...
  • 对比2个数据库表之间结构的差异,可以用到下面的工具 MySQL Utilities 下载地址: https://dev.mysql.com/downloads/utilities/ 使用方法: https://dev.mysql.com/doc/mysql-utilities/1.6/en/ 利用...
  • idea mysql数据结构导出成表格

    千次阅读 2019-07-17 15:35:19
    COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, IS_NULLABLE 是否为空, COLUMN_DEFAULT 默认值, COLUMN_COMMENT 备注 , table_name 表名 FROM INFORMATION_SCHEMA.COLUMNS...
  • 2个mysql数据结构同步方法!

    千次阅读 2015-02-10 17:21:06
    在navicat for mysql 中-工具-对比,就可以直接进行数据结构对比,对比出来是sql语句!
  • 在部署环境的时候,不小心将原有的mysql卸载掉了,幸好保留了原有数据库的data目录,里面包含了几种类型的数据,在网上查找了相应的说明,下面po处理和大家分享一下: 1.后缀名为.frm的文件:这个文件主要是用来...
  • PHP - MySQL数据结构转成HTML

    千次阅读 2011-04-18 10:21:00
    最近研究ECShop的源码,需要将数据表的结构转成HTML。在Google上搜了一番后,做出了一个db2html.php。这里分享出来,希望对大家能有所帮助。
  • MySQL数据结构

    千次阅读 2020-09-06 20:40:23
    最近在学习Mysql数据结构,这里整理下。因为主流存储引擎是InnoDB,学习的也是它。这里介绍的也是InnoDB。 数据页 在操作系统中,我们知道为了跟磁盘交互,内存也是分页的,一页大小4KB。同样的在MySQL中为了...
  • mysql底层数据结构与算法

    千次阅读 2021-03-16 17:29:26
    mysql为什么要合理使用数据结构? 索引数据结构选型: 二叉树 红黑树 hash(mysql可选择此结构): B-Tree: B+Tree(B-Tree变种,mysql默认): 数据结构在线演示 myisam的数据结构 innerDB数据结构 ...
  • MySQL数据存储结构

    万次阅读 2017-07-15 17:36:26
    第一部分:存储引擎及存储结构记住:每个索引就是...数据保存在连续的内存中,如果没有行号,还会隐式加上行号,结构如下图: 主键索引:主键列值+行号 二次索引:索引列值+行号,和主键索引没多大区别 Inodb:
  • Mysql索引数据结构

    万次阅读 多人点赞 2018-08-26 11:55:58
    其实从算法逻辑上讲,二叉查找树的查找速度和比较次数都是最小的,但是从Mysql的角度讲,我们不得不考虑一个现实问题:磁盘IO。 查找都是索引操作,一般来说索引非常大,尤其是关系型数据库这种,当数据量比较大的...
  • MySQL索引的本质,MySQL索引的实现,MySQL索引的数据结构
  • mysql索引数据结构

    千次阅读 2020-09-02 18:09:07
    由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算 3.Hash 索引不能利用部分索引键查询 对于...
  • mysql内存原理与数据结构介绍

    千次阅读 2012-08-28 14:11:01
    author:skate time:2012/08/28 ...3.mysql数据结构 4.mysql架构设想     ........ 设计系统时注意点 首先考虑: 系统不同的服务对象的定位,比如保证系统的高稳定、高能,还是对用户的友好型;总
  • MySQL索引底层数据结构索引到底是什么联合索引结构MyISAM索引文件和数据文件是分离的主键索引普通索引InnoDB索引实现主键索引普通索引 索引到底是什么 索引是帮助MySQL高效获取数据的 排好序 的 数据结构 索引存储...
  • # 无限层级mysql数据结构 # 创建表 -- auto-generated definition create table target_resource ( id int not null primary key, resource_id int null, resource_team_id int null ); # 创建关系表 ...
  • MySQL底层索引数据结构

    千次阅读 2017-08-30 17:16:54
    为什么MySQL索引数据结构要选用B Tree 、 B+Tree来实现? 我们来对比一下其他的数据结构: 常见的几种类型:  hash 二叉树  红黑树   索引效率的评价标准是IO次数 局部性原理: 空间上...
  • mysql导出数据结构

    千次阅读 2016-08-09 17:01:48
    mysqldump -u root(用户名) -p -d abc(数据库名) > abc.sql 安装目录下的bin 有mysqldump.exe(mysql倾泻工具)
  • MySQL数据目录结构

    千次阅读 2004-09-21 22:43:00
    MySQL数据目录结构蓝森林 http://www.lslnet.com 2000年5月28日 10:40作 者: 晏子从概念上讲,大多数关系数据库系统是相似的:它们有一系列数据库组成,每个数据库包含一系列数据库表,但每个系统有各自组织其管理...
  • mysql 索引数据结构(笔记)

    千次阅读 2020-03-12 12:32:09
    索引的用途:帮助mysql高效获取数据的数据结构。 索引使用策略及优化: mysql优化主要分为结构优化和查询优化。 一般在数据库系统或文件系统中使用的B+Tree结构都在经典B+Tree的基础上进行了优化,增加了顺序访问...
  • Mysql数据结构同步Python实现

    千次阅读 2018-09-20 18:13:42
    Mysql数据结构同步Python实现 Python源码 #!/usr/bin/python import MySQLdb import configparser class SchemaMysql: #初始化用户数据 isdrop参数为是否删除目标库多余的字段 def __init__(self,src_info,des...
  • navicat如何导出mysql数据结构

    千次阅读 2018-09-20 23:51:00
    我们拿navicat导出mysql数据结构为例: 1、点击“工具”–>数据传输。 2、在弹出的窗口里左边可以选择需要导出的表,右边选择连接或文件(我要导出sql文件,所以我选的是文件)选择导出的位置。 3、...
  • MySQL - 剖析MySQL索引底层数据结构

    千次阅读 2020-07-18 16:51:14
    文章目录Pre Pre 什么是索引? 通俗的说就是为了提高效率专门设计的一种 排好序的数据结构。 怎么理解呢? 举个例子哈 如上数据 ,假设有个SQL select * from t where col2 = 22 ;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,796
精华内容 17,518
关键字:

mysql数据结构

mysql 订阅
数据结构 订阅