当前位置: 首页 > 后端技术 > Java

学习MySQL必须掌握的13个关键词你掌握了吗?

时间:2023-04-02 01:24:08 Java

1。三种范式第一种范式:每个表的每一列都必须保持原子性,即表的每一列都是不可分割的;第二范式:在满足第一范式的基础上,每个表必须保持唯一性,即表的非主键字段完全依赖于主键字段;第三范式:在满足第一范式和第二范式的基础上,表中不能产生传递关系,应淘汰该表。冗余;2、字符集字符集规定了字符在数据库中的存储格式,如占用多少空间,支持哪些字符等。不同的字符集有不同的编码规则。在某些情况下,甚至有校对规则。校对规则是指字符集的排序。在MySQL数据库的运维和使用中,选择合适的字符集非常重要。如果选择不当,至少会影响数据库的性能,严重时可能导致数据存储出现乱码。MySQl常用字符集主要有以下四种:字符集长度说明GBK2支持中文,不是国际通用字符集UTF-83支持中英文混合场景,是国际通用字符集latin11MySQL默认字符集utf8mb44完全兼容用UTF-8,用四个字节存储更多的字符MySQL数据库在开发和维护中,字符集选择规则如下:如果系统开发是面向国外业务,需要处理不同的国家和语言,你应该选择utf-8或utf8mb4;如果只是需要支持中文,没有国外业务的话,出于性能考虑可以使用GBK;3.自定义变量自定义变量是用来存储内容的临时容器,在连接MySQL的整个过程中都存在。可以通过set来定义。SET@last_week:=CURRENT_DATE-INTERVAL1周;SELECTid,namefromuserwherecreate_time>@last_week;使用自定义变量注意事项:使用自定义变量的查询不能使用缓存;不能使用常量或标识符在本地使用自定义变量,例如表名、列名和limit子句;自定义变量的生命周期实际上在一个连接中是有效的,它们不能用于连接之间的通信;避免重复查询刚刚更新的数据,如果在更新行中,同时想获取这一行的信息。我该怎么做才能避免重复查询?这通常是这样做的:updateusersetupdate_time=now()whereid=1;从id=1的用户中选择update_time;使用自定义变量可以优化它:updateusersetupdate_time=now()whereid=1and@now:=now();select@now;看起来还是两次查询,但是第二次查询不需要访问任何数据表,所以会快很多。4、选择优化的数据类型MySQL支持多种数据类型,选择正确的数据类型是获得高性能的关键。(1)更小一般来说,应该尽可能使用更小的数据类型。较小的数据类型通常速度更快,因为它们占用的磁盘、内存和CPU缓存较少,并且需要较少的CPU周期来处理。(2)更简单的简单数据类型通常需要更少的CPU周期,整数比字符串类型更便宜,因为字符集和验证规则使得字符比较比整数比较更复杂。(3)尽量避免NULL许多表包含可以为NULL的列,即使应用程序不需要保存NULL,因为NULL是该列的默认属性,通常,最好将该列指定为NOTNULL。如果查询中包含NULL列,MySQL优化起来就比较困难,因为NULL列使得索引、索引统计和值比较变得更加复杂。可以为NULL的列将使用更多的存储空间,需要在MySQL中进行特殊处理。当一个可以为NULL的列被索引时,每条索引记录都需要一个额外的字节,这甚至可能导致MyISAM中的固定大小的索引变成了可变大小的索引。5.视图视图(view)是一个虚拟表,它是一个逻辑表,本身不包含数据。作为选择语句存储在数据字典中。对于多表的复杂查询,使用视图可以简化查询。当视图使用临时表时,不能使用where条件,也不能使用索引。单表视图一般用于查询和修改,会改变基础表的数据,而多表视图一般用于查询,不会改变基础表的数据。使用视图的目的是保证数据安全,提高查询效率。视图的优点:使用视图的用户完全不需要关心对应表的结构、关联条件、过滤条件。对于用户来说,已经是复合条件的过滤结果集。使用视图的用户只能访问他们被允许查询的结果集。表的权限管理不能局限于某一行某列,而是可以通过视图轻松实现。一旦确定了视图的结构,就可以屏蔽表结构变化对用户的影响。向源表添加列对视图没有影响;修改源表的列名可以通过修改视图来解决,不影响访问者。6.缓存表和汇总表有时提高性能最好的方法是将派生的冗余数据保存在同一张表中,有时又需要创建一个完全独立的汇总表或缓存表。缓存表用于存储容易获取但速度较慢的数据;汇总表用于保存使用groupby语句聚合查询的数据;对于缓存表,如果主表使用InnoDB,MyISAM将作为缓存表的引擎得到更小的索引占用空间,并且可以进行全文搜索。使用缓存表和汇总表时,您必须决定是实时维护数据还是定期重建数据。哪个更好取决于应用程序,但定期重建不仅可以节省资源,还可以防止表变得非常零散,并具有完全按顺序组织的索引。在重建汇总表和缓存表时,通常需要保证数据在运行过程中仍然可用。这需要通过使用影子表来实现。影子表是指在真实表之后创建的表。当建表操作完成后,影子表和原表可以通过原子重命名操作进行切换。为了提高读取速度,往往会建立一些额外的索引,增加冗余列,甚至创建缓存表和汇总表。这些方法会增加写入的负担,需要额外的维护工作,但是在设计高性能数据库时,这两种都是常用的技巧,虽然写入操作速度较慢,但??读取性能却有更显着的提升。7、分区表通常,同一张表中的数据在物理层面上是存储在一起的。随着业务的增长,当同一张表的数据量过大时,会造成管理上的不便。分区特性可以将一个表按照一定的规则在物理上划分为多个分区。多个分区可以单独管理,甚至存储在不同的磁盘/文件系统上,以提高效率。分区表的优点:数据可以跨磁盘存储,适合存储大量数据;数据管理非常方便,数据以分区为单位进行操作,不影响其他分区的正常运行;查询时,可以通过锁定分区的特性来缩小查询范围。提高查询性能;8.外键外键通常需要在每次修改数据时在另一个表中进行额外的查询操作。尽管InnoDB强制外键使用索引,但仍然无法消除这种约束检查的开销。如果外键的选择性非常低,这将导致选择性索引非常低。但是,在某些场景下,外键会提高一些性能。例如,如果要确保两个相关表始终具有一致的数据,那么在应用程序中使用外键比检查一致性要高效得多。此外。外键的删除和更新也比应用程序中的维护更高效。但是外键维护操作是逐行进行的,这样的更新会比批量删除和更新慢。外键约束使得在查询时需要额外访问一些其他表,即需要额外的锁。如果一条记录被写入子表,外键约束会导致InnoDB去检查对应父表的记录,即需要锁住父表的对应记录,以保证这条记录不会在本次交易完成后。时删除。这会导致额外的锁等待甚至一些死锁。这种类型的死锁很难解决,因为表不是直接访问的。因此,在目前的很多项目中,出于性能的考虑,已经不再使用外键了。9.查询缓存MySQL查询缓存存储了查询返回的完整结果。当查询命中缓存时,MySQL将立即返回结果,跳过解析、优化和执行的过程。查询缓存系统将跟踪查询中涉及的每个表。如果这些表发生变化,所有与该表相关的缓存数据都将失效。这种机制看起来效率比较低,因为当数据表发生变化时,查询可能会受到影响。结果并不重要,但这种实现的简单性是以很小的成本换来的,这对于非常繁忙的系统来说非常重要。(1)MySQL如何判断缓存命中在判断是否命中时,MySQL并不解析,而是直接使用客户端发送的SQL语句等原始信息。任何字符差异(例如空格、注释)都会导致缓存未命中。通常使用统一的编码规则是一个好习惯,这会让你的系统运行得更快。当查询语句中有一些不确定的数据时,就不会缓存,比如函数now()。事实上,如果缓存包含任何用户定义函数、存储函数、用户变量、临时表、MySQL系统表或任何具有列级权限的表,它们将不会被缓存。(2)在使用查询缓存时,需要注意开启查询缓存,这会给读写操作带来额外的消耗:在执行读查询之前,检查是否命中缓存;如果读取的查询可以缓存,那么当执行完成后,如果MySQL发现缓存中没有该查询,则将结果存储到查询缓存中,这会带来额外的系统消耗;也会影响写操作,因为在向表中写入数据时,MySQL必须保存对应表中的所有数据无效的缓存设置。如果查询缓存很大或者碎片很多,这个操作可能会带来很大的系统消耗;但是,查询缓存仍然会给系统带来性能提升。不过,上述附加消费还可能继续增加。另外querycache操作是加锁和独占操作,这个消耗不小。对于InnoDB用户,事务的某些特性限制了查询缓存的使用。当语句在事务中修改表时,MySQL会在事务提交前使该表对应的查询缓存设置失效。因此,长时间运行的事务会大大降低查询缓存的命中率。(3)如何分析和配置查询缓存10.存储过程存储过程是一组针对特定功能的SQL语句,被编译并保存在数据库中。通过指定存储过程的名称并给出参数的值,您还可以返回结果。存储过程的优点:减少网络流量,提高执行速度,减少数据库连接数,安全性高,复用性高,存储过程高。存储过程的缺点:可移植性差11、事务中的语句要么全部执行,要么根本不执行。事务具有ACID特性,ACID意味着原子性、一致性、隔离性和持久性。(1)原子性(atomicity)一个事务必须被看作是一个不可分割的最小工作单元,整个事务中的所有操作要么执行成功并成功提交,要么无故障回滚。(2)一致性(consistency)数据库总是从一种一致状态过渡到另一种一致状态。(3)隔离(isolation)一个事务所做的修改在最终提交之前对其他事务是不可见的。(4)一旦持久性(durability)事务被提交,七者所做的修改将永久保存在数据库中。12.索引索引是存储引擎用来快速查找记录的一种数据结构。我觉得数据库中最重要的知识点就是索引。存储引擎使用B-Tree索引的方式不同,性能也不同,各有优缺点。例如MyISAM使用前缀压缩技术使索引变小,而InnoDB则按照原始数据格式存储。MyISAM索引通过数据的物理位置引用索引行,而InnoDB通过主键引用索引行。B-Tree通常是指所有的值都是按顺序存储的,每个叶子页到根的距离是一样的。B-Tree索引可以加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,而是从索引的根节点开始查找。指向子节点的指针存储在根节点的槽中,存储引擎根据这些指针向下查找下层。通过将节点页的值与要查找的值进行比较,找到合适的指针进入下层子节点。这些指针实际上定义了子节点页面中值的上下界。最终存储引擎要么找到相应的值,要么记录不存在。叶子节点比较特殊,它们的指针指向索引数据而不是其他节点页面。B-Tree顺序存储索引列,因此非常适合搜索范围数据。B-Tree适用于全键值、键值范围或键前缀查找。因为索引树中的节点是有序的,除了按值查找外,索引还可以用于查询中的orderby操作。一般来说,如果B-Tree可以通过某种方式找到值,那么它也可以用这种方式进行排序。13、全文索引全文索引的目的是通过关键词匹配进行查询和过滤,基于相似度查询而不是精确查询。全文索引利用分词技术,分析某个关键词在文中出现的频率和重要程度,按照一定的算法智能筛选出我们想要的结果。全文索引一般用于查询字符串中的某些关键字,如char、varchar、text,也支持自然语言全文索引和布尔型全文索引。