1.MySQL架构从图中可以看出MySQL的最顶层是连接组件。以下服务器由连接池、管理服务和工具组件、SQL接口、查询解析器、查询优化器、缓存、存储引擎和文件系统组成。1.连接池管理,缓冲用户连接,线程处理等需要缓存的需求。连接池的作用就是把这些连接缓存起来,这样下次就可以直接使用已经建立的连接来提高服务器性能。2、管理服务和工具组件系统管控工具,如备份恢复、Mysql复制、集群等。3、SQL接口,接受用户的SQL命令,返回用户需要查询的结果。4.QueryParser当SQL命令传给解析器时,会被解析器校验和解析(权限,语法结构)。解析器由Lex和YACC实现。这是一个很长的脚本。它的主要功能是将SQL语句分解成一个数据结构,并将这个结构传递给后续的步骤。SQL语句的传递和处理会根据这个结构进行,如果分解时遇到错误,说明SQL语句不合理。5、查询优化器SQL语句在查询之前会使用查询优化器对查询进行优化。查询。可以举个例子来理解:selectuid,namefromuserwheregender=1;这个select查询是先根据where语句进行选择,而不是先查询所有表再进行age过滤。这个select查询是先根据id和name属性进行投影,而不是把所有的属性都拿出来再过滤,把两个查询条件连接起来,生成最终的查询结果6.缓存如果查询缓存有命中的查询结果,查询语句可以直接去查询缓存中取数据7.插件式存储引擎存储引擎简单来说就是一种如何管理和操作数据(存储数据、如何更新、查询数据等)的方法。因为在关系型数据库中数据是以表的形式存储的,所以存储引擎也可以称为表型(即对这张表的存储和操作的类型)。二、MySQL存储引擎对于MySQL5.5及以后的版本,默认的存储引擎是InnoDB。在5.5版本之前,MySQL的默认存储引擎是MyISAM。1、什么是MySQL存储引擎?MySQL是关系型数据库,关系型数据库的存储都是以表的形式。表的创建、数据的存储、检索、更新都是由MySQL存储引擎完成的,也就是MySQL中的MySQL存储引擎。发挥了重要作用。存储引擎可以概括为数据文件在磁盘上的不同组织形式。SQLServer和Oracle的读者可能知道这两个数据库只有一个存储引擎,而MySQL有很多种存储引擎,比如MyISAM、InnoDB和Memory。多种存储引擎是由于MySQL的开源特性.2、MySQL存储引擎的作用是什么?MySQL存储引擎在MySQL中扮演着重要的角色。它比较重要的作用大致可以归结为以下两个方面:管理建表、数据检索、创建索引等,以满足自定义存储引擎开发的需要。3.MySQL存储引擎的种类常用的存储引擎有3种:(1)InnoDB,MySQL5.5及以后版本默认的存储引擎,其优点有:容灾好,支持事务,使用行级锁,支持外键关联,支持热备份InnoDB引擎中的表,其数据的物理组织形式是簇表(ClusterTable),主键索引和数据在一起,数据在物理上按主键顺序分布实现缓冲管理,既可以缓冲索引又可以缓冲数据。并且会自动创建哈希索引,加快数据获取速度(2)MyISAM,一种管理非事务表的存储引擎;使用表级锁;提供高速存储和检索;可以配合锁实现操作系统下的拷贝备份和迁移;支持全文搜索;数据紧凑存储,从而导致更小的索引和更快的全表扫描性能。(3)MEMORY提供内存表,以前称为堆,不支持事务和外键。它处理RAM中的所有数据,以便比将数据存储在磁盘上更快地访问。对于快速查找参考和其他相同数据很有用。几种不常用的存储引擎:(4)MERGE将多个相似的MyISAM表合并为一张表,可以处理非事务表,默认包含这些表。(5)PERFORMANCE_SCHEMA该引擎主要用于收集数据库服务器的性能参数。该引擎提供以下功能:提供进程等待的详细信息,包括锁、互斥变量和文件信息;保存历史事件摘要信息,提供对MySQL服务器性能的详细判断;添加和删??除监控事件点很容易,可以随意改变mysql服务器的监控周期,比如(CYCLE,MICROSECOND)。MySQL用户不能创建存储引擎为PERFORMANCE_SCHEMA的表。(6)ARCHIVEArchive表示存档。归档后,很多高级功能不再支持,只支持最基本的插入和查询功能。Archive在MySQL5.5版本之前不支持索引,MySQL5.5之后的版本开始支持索引。Archive有很好的压缩机制。它使用zlib压缩库,在请求时实时压缩记录,因此常被用作仓库。(7)CSV这种类型的存储引擎不支持索引,即使这种类型的表没有主键列;另外,表中的字段不允许为空。csv的编码转换需要特别注意。(8)BLACKHOLE这个存储引擎支持事务,支持mvcc的行级锁。写入该引擎表的任何数据都将消失。主要用于同步归档的日志记录或中继存储。除非这个存储引擎有特殊用途,否则不适合使用。(9)FEDERATED存储引擎可以与不同的Mysql服务器组合起来,在逻辑上形成一个完整的数据库。这种存储引擎非常适合数据库分布式应用。数据存储在远程数据库中,本地不存储任何数据。4.MySQL存储引擎的选择3.数据库的范式设计)、第四范式(4NF)和第五范式(5NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的第二范式(2NF)称为第二范式(2NF),其余范式以此类推。一般来说,数据库只需要满足第三范式(3NF)即可。(1)第一范式1NF是属性的原子性,要求属性是原子的,不可分解;第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,说明数据库表满足第一范式。数据库表的每一列都是不可分割的原子数据项,而不是集合、数组或记录等非原子数据项。简而言之,第一范式是一个没有重复的域。(2)第二范式2NF是记录的唯一性,要求记录的唯一标识,即实体的唯一性,即不存在部分依赖;要满足第二范式,必须先满足第一范式。第二范式需要保证数据库表中的每一列都与主键相关,而不是只与主键的某一部分相关(主要针对联合主键)。也就是说,在一个数据库表中,一个表中只能存储一种类型的数据,不能在同一个数据库表中存储多种类型的数据。(3)第三范式3NF是字段的冗余性,要求任何字段不能从其他字段派生,它要求字段没有冗余,即不存在传递依赖;第一个是2NF,非主键列必须直接依赖主键不能传递依赖。即不能存在:非主键列A依赖于非主键列B,非主键列B又依赖于主键。简而言之,第三范式(3NF)要求一个关系不包含其他关系中已经包含的非主键信息。2、范式的优缺点优点:范式可以避免数据冗余,减少数据库空间,减少维护数据完整性的麻烦。缺点:对于按照范式规范设计的表,范式级别越高,设计的表越多。例如,可能按第一范式设计的表可能只有一个表,而按第二范式设计表时,可能会出现两个或多个表。设计此表将产生比第二范式更多的表。表越多,当我们查询一些数据的时候,就必须查询多个表中的数据,所以查询的时间要比在一个表中查询的时间高很多。也就是说,我们使用的范式越高,数据操作的性能就越低。所以,我们在使用范式设计表的时候,要根据具体的需要权衡是否使用更高的范式来设计表。3.反范式顾名思义,就是和范式要求的恰恰相反。在反范式设计模式中,我们可以允许适当的数据冗余,并利用这种冗余来缩短操作数据的时间。即以空间换取时间,多个表中的冗余数据,查询时减少或避免表之间的关联。4、反范式的优缺点:可以减少查询时表的关联;可以更好的优化索引;缺点:存在数据冗余,数据维护不正常;数据修改需要更多的成本四、MySQL索引1、数据库索引的原理原理是筛选大量收集的数据,搜索你需要获取的重要信息。例如,针对数据库中的一行或多行,筛选出符合你设置条件的人数等。建立数据库索引的便利之处在于可以快速定位信息,为查找提供帮助。2、MySQL中索引的优缺点优点:MySql所有列类型(字段类型)都可以建立索引,即可以为任意字段设置索引,大大加快数据查询速度缺点:创建和维护索引需要时间,而且随着数据量的增加,花费的时间也会增加,索引也会占用空间。我们知道数据表中的数据也会有一个最大在线设置。如果我们有大量索引,索引文件可能比数据文件大。在线值几乎达到。在对表中的数据进行增删改查时,索引也需要动态维护,降低了数据维护的速度。3、MySQL中索引的使用原理通过上面的优缺点我们应该可以知道,为每个字段都设置索引是不好的,也不是索引越多越好,而是需要合理使用。避免在频繁更新的表上建立过多的索引,在经常用于查询的字段上创建索引。数据量小的表最好不要使用索引,因为数据量小,查询所有数据的时间可能比遍历索引的时间要少,索引不一定能产生优化效果。不要在值很少的列(字段)上创建索引。比如student表的“sex”字段只有male和female两个不同的值。相反,一个字段上有很多不同的值可以被索引。以上所述只是一方面的事情。索引肯定还有很多其他优点或缺点,以及使用原则。先基本了解索引,等以后实际使用的时候,再慢慢了解其他功能。4、MySQL数据库的索引类型索引分为四类:单列索引(普通索引、唯一索引、主键索引)、复合索引、全文索引和空间索引。可以有多个单列索引。(1)普通索引MySQL中的基本索引类型没有限制。它允许在定义索引的列中插入重复值和空值,以加快查询速度。创建方法:创建表时,createCREATETABLEmytable(nameVARCHAR(32),INDEXindex_mytable_name(name));b.创建表后直接创建索引CREATEINDEXindex_mytable_nameONmytable(name);C。修改表结构ALTERTABLEmytableADDINDEXindex_mytable_name(name);注意:如果是字符串字段,还可以指定索引的长度,只需在column命令后面加上索引的长度即可(例如:name(11))(2)UniqueindexValuesinindexedcolumns必须是唯一的,但允许空值。如果是复合索引,列值的组合必须是唯一的。创建方法:创建表时,createCREATETABLEmytable(`name`VARCHAR(32),UNIQUEindex_unique_mytable_name(`name`));b.创建表后直接创建索引CREATEUNIQUEINDEXindex_mytable_nameONmytable(name);c.修改表结构ALTERTABLEmytableADDUNIQUEINDEXindex_mytable_name(name);注意:如果是字符串字段,还可以指定索引的长度,只需在列命令后面加上索引的长度即可(例如:name(11))(3)主键索引是一种特殊的unique索引,一张表只能有一个主键,不允许有空值。一般在建表的时候会同时创建主键索引。创建方法:创建表时,createCREATETABLEmytable(`id`int(11)NOTNULLAUTO_INCREMENT,`name`VARCHAR(32),PRIMARYKEY(`id`));b.修改表结构ALTERTABLEtest.t1ADDCONSTRAINTt1_pkPRIMARYKEY(id);注意:如果是字符串字段,还可以指定索引的长度,只需在列命令后面加上索引的长度即可(例如:name(11))(4)组合索引是创建于表中多个字段的组合。只有在查询条件中使用了这些字段的左字段时,才会使用索引。当使用组合索引时,最左边的前缀集紧随其后。创建方法:创建表时,createCREATETABLEmytable(`id`int(11),`name`VARCHAR(32),INDEXindex_mytable_id_name(`id`,`name`));b.创建表后,直接创建索引CREATEINDEXindex_mytable_id_nameONmytable(id,name);C。修改表结构ALTERTABLEmytableADDINDEXindex_mytable_id_name (id,name);(5)全文索引全文索引只能用在MyISAM引擎上,全文索引只能用在CHAR、VARCHAR、TEXT类型的字段上。我们介绍一下需求,说说什么是全文索引,就是在一堆文本中,通过某个关键字等,可以找到该字段所属的记录。好吧,比如如果有“你是一个漂亮的男孩,一个漂亮的女孩……”通过漂亮男孩,你或许可以找到这条记录。这里说的是可能的,因为全文索引的使用涉及到很多细节,我们只需要知道大概的意思就可以了。创建方法:创建CREATETABLE`article`(`id`int(11)NOTNULLAUTO_INCREMENT,`title`char(250)NOTNULL,`contents`textNULL,`create_at`int(10)NULLDEFAULTNULL,PRIMARYKEY(`id`),全文(内容);b.创建表后直接创建索引CREATEFULLTEXTINDEXindex_article_contentsONarticle(contents);c。修改表结构ALTERTABLEarticleADDFULLTEXTINDEXindex_article_contents (contents);(6)空间索引空间索引是为空间数据类型的字段建立的索引。MySQL中有四种空间数据类型,GEOMETRY、POINT、LINESTRING和POLYGON。创建空间索引时,请使用SPATIAL关键字。要求,引擎是MyISAM,创建空间索引的列必须声明为NOTNULL。如果您有任何问题或建议,请留言交流。更多学习内容,请访问码农到架构师的培养之路
