当前位置: 首页 > 科技观察

一篇文章学习MySQL数据库性能优化:建表、设计表、SQL优化

时间:2023-03-12 13:14:58 科技观察

概述数据库的优化要先分析再具体优化。前面已经介绍了一些优化mysql数据库sql的方法。今天我们主要从建表、设计表、具体的sql优化开始介绍一些性能优化的方法。01.建表时的性能优化1.始终为每个表设置一个ID。每张表都应该设置一个ID字段作为主键,类型应该是INT或UNSIGNED,并设置自动递增的AUTO_INCREMENT标志。因为使用了VARCHAR类型的主键,性能会有所下降。这里只有一个例外,那就是“关联表”的“外键”,即这张表的主键是由几个单独表的主键组成的。我们称这种情况为“外键”。例如:有一个“学生表”有一个学生ID,一个“课程表”有一个课程ID,那么“成绩表”就是一个“关联表”,关联了学生表和课程表.在成绩表中,学生号和课程号被称为“外键”,它们一起构成了主键。2.为搜索字段建立索引。简单的说,在建表的时候,如果对这张表的查询总是会涉及到某个字段,或者代码中已经写好的字段,那么可以考虑建索引。3.使用ENUM代替VARCHARENUM类型非常快速和紧凑。实际上,它包含一个TINYINT,但它看起来是一个字符串。这样,使用这个字段来制作一些选项列表就变得相当完美了。如果您知道某个字段(例如“国家/地区”)具有有限且固定的值,那么您应该使用ENUM而不是VARCHAR。ENUM是MySQL数据库特有的字段类型,使用后会影响到其他数据库的迁移。所以,以后如果要改变数据库的情况,一定要慎用。4.尽量使用NOTNULL。你应该始终让你的字段保持NOTNULL,这样相对节省空间(NULL也需要空间)。5.将IP地址保存为UNSIGNEDINT如果用整数来存储IP而不是VARCHAR(15)字段,可以节省很多空间(需要自己写一个IP转换的函数)。6.必须使用UTF8字符集通用编码,无需转码,无乱码风险,节省空间02.设计表时的性能优化1.选择正确的存储引擎MyISAM适用于一些需要大量数据的应用查询,但不适合大量应用写操作不是很好。即使你只需要更新一个字段,整个表都会被锁定,其他进程,甚至是读进程,在读操作完成之前都无法操作。此外,MyISAM对于SELECTCOUNT(*)等计算速度极快。InnoDB的趋势将是一个非常复杂的存储引擎,对于一些小的应用程序,它会比MyISAM慢。他是它支持“行锁”,所以写操作越多越好。而且,他还支持更高级的应用,比如:交易。相对来说,它支持事务,行级锁,并发性能更好,CPU和内存缓存页面优化使得资源利用率更高,所以大多数情况下,使用innodb引擎。2.定长表会更快。表中没有以下类型的字段:VARCHAR、TEXT、BLOB。只要包含其中一个字段,该表就不是“定长静态表”,所以MySQL引擎会使用另一种方法来处理。定长表会提高性能,因为MySQL会搜索得更快,因为这些定长表很容易计算下一条数据的偏移量,所以读取自然会快。而如果这个字段不是定长的,那么,每次要找下一个,都需要程序自己找主键。此外,固定长度的表更容易缓存和重建。但是,唯一的副作用就是定长字段会浪费一些空间,因为定长字段不管你用不用都需要分配那么多空间。3、垂直拆分“垂直拆分”是将数据库中的一张表按列拆分成若干张表的方法,可以减少表的复杂度和字段数,从而达到优化的目的。(因为现在的公司往往一张表有很多字段,太复杂了,这个后面还要分)例1:Users表中有一个字段是家庭住址。该字段是可选字段。相对于Fromthebeginning,操作数据库时除了个人信息外,不需要频繁读取或重写该字段。那么,为什么不把他放在另一张桌子上呢?这将使您的表具有更好的性能。在大量情况下,对于用户表,只有用户ID、用户名、密码、用户角色等会被频繁使用。使用。较小的表总是会有更好的性能。示例2:有一个名为“last_login”的字段,每次用户登录时都会更新该字段。但是,每次更新都会导致该表的查询缓存被清空。所以,你可以把这个字段放在另一个表中,这样就不会影响你继续读取用户ID、用户名、用户角色,因为查询缓存会帮助你提高很多性能。另外需要注意的是,不要频繁join这些分离字段组成的表,否则性能会比不拆分的差,而且会极度下降。03.优化SQL语句1.使用querycache检查缓存是否开启:mysql>select@@query_cache_type;启用缓存,修改my.cnf,在末尾添加,重启MySQL生效:query_cache_type=1query_cache_size=600000启用MySQL查询缓存可以大大提高降低数据库服务器的CPU占用率。实际使用情况是:开启前CPU占用率120%左右,开启后下降到10%。但是,使用查询的缓存非常受限。当使用场景以只读为主,更新较少时,可以考虑开启查询缓存。2.只有一行数据时使用LIMIT1。在这种情况下,添加LIMIT1可以提高性能。这样,MySQL数据库引擎在找到一条数据后就会停止搜索,而不是继续搜索下一条与该记录匹配的数据。3.JOIN表时使用等价类型的实例,并建立索引。如果JOIN操作较多,需要对JOIN字段进行索引,同时保证这些字段的类型一致。4.避免SELECT*从数据库中读取的数据越多,查询就会变得越慢。因此,应养成按需取用的好习惯。5.拆分大的DELETE或INSERT语句如果你需要在一个在线网站上执行大量的DELETE或INSERT查询,你需要非常小心,避免你的操作让你的整个网站停止响应。因为这两个操作都会锁表,一旦表被锁住,其他操作就无法进入。执行如此大量的DELETE和INSERT可以分成几个部分,每个部分都在暂停后执行。04.其他1.EXPLAIN你的SELECT查询使用EXPLAIN关键字让你知道MySQL是如何处理你的SQL语句的。这可以帮助您分析查询语句或表结构中的性能瓶颈。查看行列可以让我们找到潜在的性能问题。2.从PROCEDUREANALYSE()获取建议PROCEDUREANALYSE()会让MySQL分析该字段及其实际数据,并提供一些有用的建议(只是建议)。这些建议只有在表中有实际数据的情况下才有用,因为一些大的决策需要基于数据。mysql>select*frommysql.userprocedureanalyze();