【.com速译】通常,流行的数据库管理系统(DBMS)如MySQL都是由网络托管方(如云服务平台)提供的。这些数据库往往被设置为默认或通用的运行模式,可能并不适合用户系统的真实运行环境。为此,我们有必要对其进行适当的优化。但是,说到数据库优化,大家可能第一时间想到的是更高的查询效率,更高的整体性能等等。事实上,优化的好处远不止于此。在具体实现方式上,数据库管理员往往需要与Web开发团队一起根据目标系统的实际情况更改相应的配置策略和规则。本文将列出七种常用的数据库优化技术,供Web开发者参考和实践。1.删??除未使用的表通常,当您在应用程序中删除或禁用插件时,不会自动删除相应的数据库表。此外,它们还保留完整的用户信息、默认选项和其他数据。这些遗留数据集不仅是来自各种攻击的系统安全风险,而且还可能降低服务器和系统的整体性能。如果你使用的是WordPress,你可以安装一个名为“插件垃圾收集器”(PluginsGarbageCollector)的插件来扫描并找到目标数据库中任何未使用的数据表,供你选择和删除。当然,如果你更喜欢命令行操作,可以使用下图所示的UPDATE_TIME字符串,直接找到那些不活跃的数据表。来自StackOverflow的UPDATE_TIME字符串示例。资料来源:计算器溢出。但是有些插件在访问数据集后可能无法更新目标数据表,所以在删除数据库表之前需要仔细检查是否确实不再使用或在某处调用。并且作为预防措施,在进行任何修改之前,您最好事先手动创建目标数据库的备份。当然,托管云服务通常会提供服务器的自动备份,您只需要提前知道如何从中恢复即可。2、创建执行计划执行计划的主要作用是展示创建和执行查询所涉及的各种检索数据的方法,包括:它查询哪些表,先查询使用哪个表,后查询哪个表,是否使用索引,查询是否高效。因此,一个典型的执行计划包括以下几个方面:操作类型操作顺序可用索引通过统计估计行数通过结果估计行数下图是一个ApexSQL执行计划的图形示例:ApexSQL执行计划示例。资料来源:ApexSQL。可见,只有获取到合适的执行计划,才能构建实用的索引,进一步优化目标数据库,为后续的优化打下基础。3.适当的索引从概念上讲,索引可以让您更快地访问数据库并加快查询速度。反之,如果你没有正确使用索引,查询将被缓慢处理。当然,过度索引数据库不会给系统带来任何好处。当前,Web开发人员经常使用两种类型的数据库索引:聚合(聚集索引)和非聚集索引(非聚集索引)。资料来源:数据学校。聚合使用主键来组织表中的数据。即定义主键后,会自动创建索引。定义主键。资料来源:数据学校。非聚集索引的主要目的是通过创建更容易搜索的列来加快查询效率。创建索引。资料来源:数据学校。4.避免通过索引访问临时表根据MySQL官方文档,创建临时表的一个条件是评估语句中包含的ORDERBY子句和不同的GROUPBY子句。但是,您可以通过使用“索引访问”来避免使用ORDERBY子句来创建临时表。使用此类索引的先决条件是所有GROUPBY列必须引用同一索引中的不同属性。此外,索引必须按顺序存储它们的键。目前,我们可以在MySQL中使用两种类型的索引访问:松散索引扫描和紧索引扫描。其中,松散索引扫描只考虑了一小部分索引键,并不能满足查询中的每一个WHERE条件。如果WHERE子句中包含范围谓词,那么松散索引扫描会先在每组中找到第一个满足范围条件的键,然后读取最少数量的键。当然,对于数据表预先确定的一些条件可以直接使用松散索引扫描。当松散索引扫描适合查询时,EXPLAIN的输出会在额外列(Extracolumn)中显示那些用于group-by的索引。以下查询示例使用松散索引扫描访问:查询列表示例:idx(c1,c2,c3)ontablet1(c1,c2,c3,c4)。资料来源:MySQL。如果目标数据表条件不支持松散索引扫描,可以选择紧索引扫描。当然,根据实际查询需求,也可以在此基础上选择完整或一定范围的紧索引扫描。这种索引访问的基础是:当一定范围内的条件的所有键都被找到时,数据库不会为GROUPBY子句生成一个临时数据表来满足查询。虽然下面的查询示例不适合松散索引扫描,但我们可以使用紧索引扫描:查询列表示例:idx(c1,c2,c3)ontablet1(c1,c2,c3,c4)。资料来源:MySQL。5.避免编码循环。如果一个SQL查询需要运行多次,那么系统不仅效率低下,而且可能会导致不必要的性能问题。对于大型数据集,此类问题会迅速累积并最终使系统不堪重负。目前业界已经有很多好的解决方案。本质上,这些方法将查询移出循环以确保它只执行一次。以下示例显示如何使用JOIN和GROUPBY从多个表中选择数据并让数据库使用单个查询执行计数。此方法对多个查询(包括COUNT和MAX子句)特别有效。使用加入和分组依据。资料来源:代码乌托邦。当然,也可以使用子查询,即在SELECT子句中嵌套SELECT子句。由于此类查询需要较少的资源来执行,因此它们对于组合查询很有用。子选择的例子。资料来源:代码乌托邦。6.去掉相关子查询从本质上讲,相关子查询(Correlatedsubqueries)是一种编码循环。即逐行运行子查询,直到满足父语句。当输出主要依赖于多部分答案验证时,这种方法很有效。相关子查询流程图。资料来源:GeeksforGeeks。您可以通过使用JOIN子句避免相关子查询来提高查询效率。实际上,此方法取代了WHERE并消除了前端请求为每一行单独执行子查询的需要。下图显示了此方法的工作原理:JOIN子句示例示例。资料来源:育碧。7.避免*式查询每个查询的最终目标都是有效地检索相关数据。但是,在创建查询时,使用SELECT*子句通常会导致检索大量不相关的各种数据。如果目标数据集很小,这种影响是微不足道的,但在处理大型数据集时可能很重要。因此,为了优化查询速度,减少系统资源的消耗,我们应该尽量减少查询的数据量。通常,您可以在以下代码段中使用LIMIT子句来限制查询结果的输出。当然,如果你真的需要检索和查询整个数据集,你仍然可以使用SELECT*。LIMIT子句的示例。来源:TechontheNet总结对于Web开发人员来说,优化数据库并不容易,而且往往不是一蹴而就的。但是,通过反复的尝试和调试,相信你一定能够通过上面给出的七种技巧来提升目标数据库的性能和查询效率。当然,值得注意的是,在进行任何调优之前,请做好数据库的备份工作,以便在需要时可以恢复到之前的状态。原标题:Web开发者的7个数据库优化技巧,作者:KristinaTuvikene
