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);

原文地址:https://www.cnblogs.com/linhongwenBlog/p/13265244.html