香港云服务器的数据库响应时间要如何优化?

已关闭留言

香港云服务器的数据库响应时间要如何优化?

数据库是一组数据,其排列方式易于检索、管理和更新。数据存储在行、列和表中。它被编入索引以更快地检索所需信息。首先我们简要讨论基础知识,然后我们将继续讨论这个常见问题――如何优化数据库响应时间?

数据库类型

主要有四种结构的数据库管理系统:

分层数据库

网络数据库

关系型数据库

面向对象的数据库

最近,NoSQL 和面向对象的数据库已经发展到用于存储数据。NoSQL 数据库不遵循行//表方法。NoSQL 数据库是基于文档的,包括键值对的集合,图形数据库没有 RDBMS 中的传统模式。NoSQL 数据库非常适合处理大量分布式数据。只有有限的外部专家可以协助设置和部署大规模 NoSQL 部署。

关系数据库是最常用的数据库系统。SQL ServerOracle 数据库、Sybase MySql 是关系数据库的一些示例。RDBMS 允许多个用户同时访问数据,而不会影响安全因素。RDBMS 中的表的工作方式类似于电子表格。一组表被称为模式。许多模式组合在一起构成了一个数据库。单个服务器可以包含多个数据库。

现在让我们讨论如何优化数据库响应时间

在设计数据库之前和编写 SQL 脚本以优化数据库响应之前,必须考虑下面提到的技巧。

1. 数据库统计信息: SQL 优化器必须非常了解每个目录中不同表中包含的统计信息。有关索引及其分布的详细信息称为统计信息。使用这些细节,优化器决定满足查询的最佳路径。过时或丢失的统计详细信息将导致优化器采用非最佳路径,从而导致响应时间增加。考虑以下示例查询:

select *

from Customer

where city = “Pune”

and phone =213-345-346;

这里的 Customer 是表名。

在上面的查询中,Where 子句有两个字段。定义了两个索引,每个索引包含一个字段。优化器每个表只能使用一个索引。在这种情况下,如果优化器使用 phone 字段作为返回最少行数的索引,查询将运行得更快。所以,如果数据库没有正确更新,如果没有选择正确的字段作为索引,响应时间将会大大增加。

2. 构建优化索引:索引对于构建任何查询都非常重要。但是,许多索引会降低(插入、更新或删除)查询的速度。有必要保持表上索引的适当平衡。表中包含的字段及其顺序也起着至关重要的作用。

(a) 复合索引:当一个索引包含多个字段时,称为复合索引。当执行在 where 子句中包含多个字段的查询时,会构建复合索引。在这种情况下,与单独的第一个字段相比,所有字段组合在一起将显着生成最少的行数。

(b) 聚集索引: 表中数据排列的物理顺序称为聚集索引。这意味着实际数据是根据索引字段排序的。示例:其中数据按某人的姓氏排列的电话簿。每个表只能有一个聚集索引。聚集索引通常用于经常在列中搜索一系列值的情况。

3. 避免在运算符的 RHS 上使用函数: 函数和方法经常用于SQL 查询。考虑下面的例子:

选择 *

from Customer

where YEAR(Sample CreatedOn) == 2009

AND Month(SampleCreatedON) = 6;

在上面的查询中,SampleCreatedOn 有一个索引。但是, where 子句以这样的方式更改,无法使用该索引。以下面的方式修改查询会极大地增加响应时间。

select * from Customer where SampleCreatedOn between ‘6/1/2009’ and ‘6/30/2009’;

4. 指定索引的预期增长: 最小化索引负面影响的一种方法是在创建索引时为预期增长指定适当的值。

索引列的数据通常存储在磁盘上。如果表中包含新行或修改索引列中的现有值,数据库必须重新组织数据存储以累积新行。这种重组会影响查询的响应时间。在这种情况下,如果定期合并新行,则可以预先指定索引的预期增长。在 MS SQL Server 中,用于表示预期增长的术语是 FILL FACTOR,而对于 Oracle DB2,它是 PCTFREE,意思是免费百分比。

5. SELECT 中包含优化器提示: 在选择查询中提及索引名称始终是一个好习惯。考虑下面的例子。

select * from Customer

with (Index(IdxPhone))

where city = “Pune” AND phone = ‘213-345-346’;

FROM 后面的附加 WITH 子句指示索引名称将有助于增加查询的响应时间。上面的示例特定于 MS SQL SERVER

6EXPLAIN的使用: 优化器创建的SELECT语句的执行计划,多数情况下是由数据库返回的。这种执行对微调 SQL 查询有很大帮助。

执行计划的 SQL 语法是 Set SHOWPLAN_ALL ON>Query<WINSQL Professional等工具也可用于运行 EXPLAIN 命令。

7. 避免外键约束: 使用外键约束可确保数据完整性,但以性能为代价。如果优化响应时间是主要目标,则可以避免外键约束。例如: RDBMS 中的 System 表包含有关用户数据库的元数据信息。此处包含的表包含关系但没有外键。此处的客户端强制执行这些规则以优化数据库响应时间。

8、多块硬盘的使用: 随着数据库容量的增加,硬盘上的I/O操作明显变慢。可以将数据库拆分到多个物理硬盘驱动器以加快 I/O。也可以将一个表的内容拆分到多个磁盘中。随着更多磁头并行检索数据,使用多个磁盘可提高 I/O 操作的速度

9. 选择最少数据: 检索到的最少数据,查询运行得越快。过滤尽量在服务端进行,而不是在客户端进行过滤。这将导致处理的数据最少,并提供更快的结果。消除任何计算列或不必要的列。考虑下面的例子:

选择名字、姓氏、城市,其中城市 =“浦那

在上面的示例中,可以避免城市列,因为它始终是 Pune。尽管它不会产生很大的影响,但它可以改善大型数据集的响应时间。

10. 加载数据前删除索引。

可以在加载大量数据之前删除表上的索引。这允许插入语句更快地工作。插入完成后,可以再次重新创建索引。

对于需要插入数千行的在线系统,可以使用临时表来加载数据。这个临时表不应该有任何索引。将数据从一个表传输到另一个表总是比从外部源加载快得多。删除主表上的索引,将数据从临时表传输到最终表,最后再次创建索引。

优化响应时间的更多技巧

避免使用 Group ByOrder By Distinct: 必须尽可能避免使用 Group ByOrder By Distinct。使用上述子句时,SQL Server 会创建一个临时表并将数据加载到该表中。根据查询的请求在此临时表中处理数据并检索最终结果。因此,在绝对必要时,始终建议在查询中使用 Group ByOrder By Distinct

Use Set NOCOUNT ONSet NOCOUNT ON 必须用于 DML 操作(插入、更新、删除和选择)。SQL server 默认计算并返回受影响的行数。小型查询不会受到太大影响,但是对于具有大量连接的大型复杂查询,这会导致很大的性能问题。设置 NOCOUNT ON 肯定会增加响应时间,因为它不会计算受影响的行数。

包括所有者/架构名称: 表的对象名称,存储过程必须与所有者/架构名称一起作为前缀。如果省略所有者/架构名称,则服务器将在所有架构中搜索该对象,直到找到该对象。指定所有者/模式指示服务器仅在该特定模式中搜索表。

可空列: 在与可空列进行比较时,避免使用 NOT IN 并使用 NOT EXISTS。当在查询中使用 NOT IN 时,SQL Server 将检查每个结果(即使没有包含空值的行)以确定它是否为空。NOT EXISTS 不执行与空值的比较检查。

调整内部变量: 微调一些默认设置有助于加快响应时间和提高性能。

更改索引缓冲区大小 (key_buffer)

在管理表索引(读取和写入操作)时,可以借助此变量控制缓冲区大小。该变量的值可以增加到系统总内存的 25% 左右。要缩短响应时间,请尝试为此变量使用不同的值。

更改表缓冲区大小 (read_buffer_size)

在查询需要按顺序检查表的情况下,MySQL 为该查询提供内存缓冲区。缓冲区大小由 read_buffer_size 变量控制。如果顺序扫描需要更多时间,则可以通过增加此值的大小以及内存缓冲区的大小来提高性能。

设置最大打开表数(table_cache

在任何特定时间可以打开的最大表数由 table_cache_variable 管理。此变量类似于 max_connections 变量。增加此变量的值允许大量表保持打开状态。如果服务器收到对各种数据库和表的查询,则可以更改 table_cache 值。

为长查询指定时间限制 (long_query_time)

使用 long_query_time 变量允许跟踪低效或行为不当的查询。这个变量对提高响应时间和优化性能有很大帮助。