前言之前咱们更新MySQL优化查询的学习内容,今天我们继续来学习MySQL优化数据库结构。每天深入一小时,日积月累,大厂就在向你招手!!!一个好的数据库设计方案对于数据库的性能常常会起到事半功倍的效果。合理的数据库结构不仅可以使数据库占用更小的磁盘空间,而且能够使查询速度更快。数据库结构的设计,需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。将字段很多的表分解成多个表对于字段较多的表,如果有些字段的使用频率很低,可以将这些字段分离出来形成新表。因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变慢。假设会员表存储会员登录认证信息,该表中有很多字段,如id、姓名、密码、地址、电话、个人描述字段。其中地址、电话、个人描述等字段并不常用。可以将这些不常用字段分解出另外一个表。将这个表取名叫members__detail。表中有member_jid、address、telephone、description等字段。其中,member_id是会员编号,address字段存储地址信息,telephone字段存储电话信息,description字段存储会员个人描述信息。这样就把会员表分成两个表,分别为members表和mermber_detail表。创建这两个表的SQL语句如下:这两个表的结构如下:如果需要查询会员的详细信息,可以用会员的id来查询。如果需要将会员的基本信息和详细信息同时显示,可以将members表和members_detail表进行联合查询,查询语句如下:SELECT*FROMmembersLEFTJOINmembers_detailONmembers.id-membersdetail.member_id;通过这种分解,可以提高表的查询效率。对于字段很多且有些字段使用不频繁的表,可以通过这种分解的方式来优化数据库的性能。增加中间表对于需要经常联合查询的表,可以建立中间表以提高查询效率。通过建立中间表,把需要经常联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询,以此来提高查询效率。本小节将为读者介绍增加中间表优化查询的方法。首先,分析经常联合查询表中的字段。然后,使用这些字段建立一个中间表,并将原来联合查询的表的数据插入到中间表中。最后,可以使用中间表来进行查询了。会员信息表和会员组信息表的SQL语句如下:查询会员信息表和会员组信息表。已知现在有一个模块需要经常查询带有会员组名称、会员组备注(remark)、会员用户名信息的会员信息。根据这种情况可以创建-一个temp__vip表。temp_vip表中存储用户名(user_name),会员组名称(group_name)和会员组备注(group_remark)信息。创建表的语句如下:接下来,从会员信息表和会员组表中查询相关信息存储到临时表中:以后,可以直接从temp_vip表中查询会员名、会员组名称和会员组备注,而不用每次都进行联合查询。这样可以提高数据库的查询速度。增加冗余字段设计数据库表时应尽量遵循范式理论的规约,尽可能减少冗余字段,让数据库设计看起来精致、优雅。但是,合理地加入冗余字段可以提高查询速度。本小节将为读者介绍通过增加冗余字段来优化查询速度的方法。表的规范化程度越高,表与表之间的关系就越多,需要连接查询的情况也就越多。例如,员工的信息存储在staff表中,部门信息存储在department表中。通过staff表中的department_id字段与department表建立关联关系。如果要查询一个员工所在部门的名称,必须从staff表中查找员工所在部门]的编号(departmentid),然后根据这个编号去department表查找部门的名称。如果经常需要进行这个操作,连接查询会浪费很多时间。可以在staff表中增加一个冗余字段deartment.name,该字段用来存储员工所在部门的名称,这样就不用每次都进行连接操作了。冗余字段会导致一些问题。比如,冗余字段的值在一个表中被修改了,就要想办法在其他表中更新该字段。否则就会使原本一致的数据变得不一致。分解表、增加中间表和增加冗余字段都浪费了一定的磁盘空间。从数据库性能来看,为了提高查询速度而增加少量的冗余大部分时候是可以接受的。是否通过增加冗余来提高数据库性能,这要根据实际需求综合分析。优化插入记录的速度插入记录时,影响插入速度的主要是索引、唯--性校验、一.次插入记录条数等。根据这些情况,可以分别进行优化。本小节将为大家介绍优化插入记录速度的几种方法。对于MyISAM引擎的表,常见的优化方法如下:1、禁用索引对于非空表,插入记录时,MySQL会根据表的索引对插入的记录建立索引。如果插入大量数据,建立索引会降低插入记录的速度。为了解决这种情况。可以在插入记录之前禁用索引,数据插入完毕后再开启索引。禁用索引的语句如下:ALTERTABLEtablenameDISABLEKEYS;其中table_name是禁用索引的表的表名。重新开启索引的语句如下:ALTERTABLEtable_nameENABLEKEYS;对于空表批量导入数据,则不需要进行此操作,因为MyISAM引擎的表是在导入数据之后才建立索引的。2、禁用唯一性检查插入数据时,MySQL会对插入的记录进行唯--性校验。这种唯一-性校验也会降低插入记录的速度。为了降低这种情况对查询速度的影响,可以在插入记录之前禁用唯一性检查,等到记录插入完毕后再开启。禁用唯--性检查的语句如下:SETUNIQUE_CHECKS=0;开启唯一性检查的语句如下:SET3UNIQUE_CHECKS=1;3、使用批量插入插入多条记录时,可以使用一条INSERT语句插入-条记录;也可以使用一-条INSERT语句插入多条记录。使用一条INSERT语句插入一条记录的情形如下:使用一条INSERT语句插入多条记录的情形如下:第2种情形的插入速度要比第1种情形快。4、使用LOADDATAINFILE批量导入当需要批量导入数据时,如果能用LOADDATAINFILE语句,就尽量使用。因为LOADDATAINFILE语句导入数据的速度比INSERT语句快。对于InnoDB引擎的表,常见的优化方法如下:1、禁用唯一性检查插入数据之前执行setunique_checks=0来禁止对唯一索引的检查,数据导入完成之后再运行setunique_checks=1。这个和MyISAM引擎的使用方法-样。2、禁用外键检查插入数据之前执行禁止对外键的检查,数据插入完成之后再恢复对外键的检查。禁用外键检查的语句如下:SETforeign_key_checks=0;恢复对外键的检查语句如下:SETforeign_key_checks=l;3、禁止自动提交插入数据之前禁止事务的自动提交,数据导入完成之后,执行恢复自动提交操作。禁止自动提交的语句如下:setauto
转载请注明:http://www.aierlanlan.com/rzdk/6539.html