zoukankan      html  css  js  c++  java
  • Mysql的结构

    mysql的组成

    Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的

    各模块解释

    Connectors:用来与客户端应用程序建立连接的数据库接口。
    Management Services & Utilities:系统管理和服务控制相关的辅助工具。
    Connection pool:负责处理与用户访问有关的各种用户登录、现场处理、内存和进程缓存需求。
    Sql interface:提供从用户接受命令并把结果返回给用户的接口。
    Parser:对SQL语句进行语法分析和解析,构造成一个用来执行查询的数据结构。
    Optimizer:语句优化器。
    Caches & Buffers:Buffer(Buffer Cache)以块形式缓冲了块设备的操作,定时或手动的同步到硬盘,它是为了缓冲写操作然后一次性将很多改动写入硬盘,避免频繁写硬盘,提高写入效率。Cache(Page Cache)以页面形式缓存了文件系统的文件,给需要使用的程序读取,它是为了给读操作提供缓冲,避免频繁读硬盘,提高读取效率。

    插件式存储引擎

    插件式表存储引擎是底层物理结构的实现,负责为数据库执行实际的数据I/O操作,它是基于表而不是数据库的。可以根据实际应用需求为每个表设定不同的选择。
    插件式存储引擎的核心是文件访问层的一个抽象接口,任何人都可以利用这个API接口去建立新的文件访问机制。
    InnoDB:支持事务及多版本控制(MVCC),支持外键,5.5以后为Mysql的默认存储引擎,独立的.ibd文件存储数据和索引信息,.frm文件存储表结构。
    Myisam:MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求,Mysql4到Mysql5.5之间的默认存储引擎。 .myd文件存储数据,.myi文件存储索引,.frm存储表结构。
    Memory:memory使用存在内存中的内容来创建表。每个MEMORY表实际对应一个磁盘文件,格式是.frm。MEMORY类型的表访问非常快,因为它到数据是放在内存中的,并且默认使用HASH索引,但是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。
    Mysql还有archive,csv,blackhole,performation_schema等存储引擎。

    InnoDB

    对于理解InnoDB最核心的事情是:凡事都是索引。所有的表都是IOT索引组织表。

    每个表都有一个主键。如果建表时没有指定,则会使用第1个非空唯一键;如果也没有,那么就会自动在表中生成一个6字节(48bit)的隐含“Row ID”字段作为主键。隐含主键对你是无用的但是却浪费了每条记录6字节的空间。
    行记录数据(非主键字段)存储在主键索引结构中,也被称为“聚集键”。此索引结构是基于主键字段的,行数据就是依附于这个键的值 (也包含用于MVCC的一些额外字段——事物号、回滚指针等)。
    除了主键的聚集索引,其他索引(普通索引)中不会保存行的物理位置,而是保存主键的值,所以通过"二级索引"进行查找是先找到主键,再找到行,要进行二次索引查找。

    Mysql Innodb默认的隔离级别是repeat able,这和oracle的read commited有较大差异。

    REPEATABLE READ — 默认的MySQL/InnoDB隔离级别。事务启动后会创建一个读视图,并且此读视图会用于事务中的所有语句,实现了语句间的数据库一致性视图。也就是说,在事务中,读取数据是“可重复的”。

    READ COMMITTED — 每条语句使用一个新读视图,基于语句启动时的最大当前提交事物ID。在语句中读取或返回的记录互相之间保持一致性,但是语句和语句之间会看到新数据。

    另外MySQL/InnoDB也支持额外的一种隔离级别,称为可序列化(SERIALIZABLE), 但这种隔离级别比较与REPEATABLE READ,主要是锁定上的不同,并不是事务可见性。

    对于理解InnoDB最核心的事情是:凡事都是索引。所有的表都是IOT索引组织表。

    自增列-AUTO_INCREMENT

    使用如下函数实现nextval的取值。
    DELIMITER $$
    CREATE  FUNCTION   TEST_CURRVAL  () RETURNS INT(11)
    BEGIN  
      DECLARE CURRENT_VALUE INT;  
      INSERT INTO SQ_TAB1 VALUES(NULL);
      SET CURRENT_VALUE=(SELECT ID  FROM SQ_TAB2 ORDER BY ID DESC LIMIT 1);
      RETURN CURRENT_VALUE;  
    END$$
    DELIMITER;

    临时表

    Mysql临时表是指使用create temprary table创建的临时表,临时表可以使用任何存储引擎,临时表只在单个连接中可见,当连接断开时,临时表也会消失。MySQL最初会将临时表创建在内存中,当数据变的太大后,就会转储到磁盘上。tmp_table_size 参数限定单个临时表在内存中的大小,超过将转到磁盘上。

    1. 不同会话创建的表的名字可以一样。
    2. 表结构和数据都放在内存中,磁盘上不创建frm文件。
    3. 会话消失表结构和数据都消失。
    4. 可以创建索引,删除索引。
    5. 主库创建的表,备库查不到。
    6. show tables 看不到表。
    7.在同一个查询中只能查找一次临时表。

    内存表

    Mysql内存表是使用memory存储引擎的表,表结构定义保存在磁盘中,数据保存在内存中。内存表可以限定表的大小,使用参数max_heap_table_size,但不会转存到磁盘上。Delete操作不会回收内存,只有drop才能回收内存。

    1. 不同session,创建表的名字不能一样。
    2. 一个session创建会话后,对其他session也是可见的。
    3. 表结构放在磁盘上,数据放在内存中。
    4. mysql 重启或者关闭后内存表里的数据会丢失,但是表结构仍然存在。
    5. 可以创建索引,删除索引,支持唯一索引。
    6. 不影响主备,主库上插入的数据,备库也可以查到。
    7. show tables 看得到表。

    mysql性能优化

    对mysql进行性能监控优化,首先我们要了解mysql的各种日志。Mysql的日志有5种类型,分别是:error log,general query log,binary log,relay log和slow query log。在默认情况下,mysql不会启动任何log类型的log。

    所有日志默认都会存放在统一路径下(/var/lib/mysql),可以通过flush log命令强制关闭日志服务后重新开启日志。当执行flushlog命令时,会刷新日志,执行mysqladmin命令也可以达到同样的效果。对于binary log,当日志大小达到max_binlog_size时,会自动触发对binlog的flash操作。
    在5种类型日志中,只有general query log和slow query log可以在线动态启用和关闭。并能修改日志文件名称路径,以及可以修改日志的存放模式(日志文件和数据表)。Mysql对generl log和slow log的控制比较灵活,可以根据需要设定日志存放模式,也可以两种模式同时使用,但是日志以数据表的方式进行存储时(分别对应mysql.general_log和mysql.slow.log),会对性能有影响,建议采用日志文件的形式进行保存日志。

    慢日志

    参数slow_launch_time的值代表着捕获所有执行时间超过2秒的查询,slow log可以记录没有使用索引的查询,也能记录执行速度比较慢的管理命令。
    开启log_queries_not_using_indexes,将会记录没有使用索引的查询到slow日志里。
    可以使用MySQL自带的mysqldumpslow工具来对慢日志进行简单分析。参数说明如下:
    -s:排序方式。c , t , l , r 表示记录次数、时间、查询时间的多少、返回的记录数排序,ac , at , al , ar 表示相应的倒叙;
    -t:返回前面多少条的数据;
    -g:参数后面可以模糊查询相应字符串的语句,用双引号进行分隔,字符串内容大小写不敏感;
    例如:
    #slow记录最多的10个语句。
    mysqldumpslow -s r -t 10 /slowquery.log

    mysql的索引

    1、普通索引

    最基本的索引,它没有任何限制,用于加速查询。

    创建方法:

    a. 建表的时候一起创建

    CREATE TABLE mytable ( name VARCHAR(32) , INDEX index_mytable_name (name) );

    b. 建表后,直接创建索引

    CREATE INDEX index_mytable_name ON mytable(name);

    c. 修改表结构

    ALTER TABLE mytable ADD INDEX index_mytable_name (name);

    注:如果是字符串字段,还可以指定索引的长度,在列命令后面加上索引长度就可以了(例如:name(11))

    2、唯一索引

    索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

    创建方法:

    a. 建表的时候一起创建

    CREATE TABLE mytable ( `name` VARCHAR(32) , UNIQUE index_unique_mytable_name (`name`) );

    b. 建表后,直接创建索引

    CREATE UNIQUE INDEX index_mytable_name ON mytable(name);

    c. 修改表结构

    ALTER TABLE mytable ADD UNIQUE INDEX index_mytable_name (name);

    3、主键索引

    是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引。

    创建方法:

    a. 建表的时候一起创建

    CREATE TABLE mytable ( `id` int(11) NOT NULL AUTO_INCREMENT , `name` VARCHAR(32) , PRIMARY KEY (`id`) );

    b. 修改表结构

    ALTER TABLE test.t1 ADD CONSTRAINT t1_pk PRIMARY KEY (id);

    4、组合索引

    指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合。

    创建方法:

    a. 建表的时候一起创建

    CREATE TABLE mytable ( `id` int(11) , `name` VARCHAR(32) , INDEX index_mytable_id_name (`id`,`name`) );

    b. 建表后,直接创建索引

    CREATE INDEX index_mytable_id_name ON mytable(id,name);

    c. 修改表结构

    ALTER TABLE mytable ADD INDEX index_mytable_id_name (id,name);

    5、全文索引

    主要用来查找文本中的关键字,而不是直接与索引中的值相比较。

    fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。

    fulltext索引配合match against操作使用,而不是一般的where语句加like。

    它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。

    创建方法:

    a. 建表的时候一起创建

    CREATE TABLE `article` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(250) NOT NULL , `contents` text NULL , `create_at` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), FULLTEXT (contents) );

    b. 建表后,直接创建索引

    CREATE FULLTEXT INDEX index_article_contents ON article(contents);

    c. 修改表结构

    ALTER TABLE article ADD FULLTEXT INDEX index_article_contents (contents);

  • 相关阅读:
    Flutter-常用插件庫
    Flutter-發送短信驗證碼
    Flutter-Radio單選框
    Flater-Provide狀態管理
    android sdk安装
    Android Studio的安装
    Flutter SDK安装(windows)
    Flutter-dialog彈出框
    python中的迭代器与生成器
    python闭包与装饰器
  • 原文地址:https://www.cnblogs.com/linhongwenBlog/p/13265244.html
Copyright © 2011-2022 走看看