Sql 简明教程

SQL - Database Tuning

SQL Database Tuning

SQL 数据库调整是优化数据库防止其成为瓶颈的一组活动。

有各种技术可用来配置特定数据库的最佳性能。数据库调整与查询调整有重叠;因此,良好索引和避免不当查询有助于提高数据库效率。此外,增加存储量、更新到最新数据库版本以及投资更强大的 CPU(如果需要)也都是一些常用技术。

Database Tuning Techniques

我们可以实施以下技术来优化数据库性能:

Database Normalization

规范化是消除数据库中重复数据的过程。我们可以通过将大型表分解成较小的相关表格来规范化数据库。这提高了数据库的性能,因为它检索数据需要更少的时间,而不是一个大表。

Proper Indexes

在 SQL 中,索引是数据库中特定数据位置的指针(内存地址)。我们在数据库中使用索引减少查询时间,因为数据库引擎可以使用其索引来跳至特定记录的位置而不是扫描整个数据库。

Avoid Improper Queries

选择正确的查询来高效检索数据也可以提高数据库的性能。例如,当我们只需要单列中的数据时选择检索整个表时会不必要地增加查询时间。因此,明智地查询数据库。

让我们讨论一些常见的不当查询,以及如何纠正它们以优化数据库性能。

1. Use SELECT fields instead of SELECT ( )*

在大型数据库中,我们总是应该仅从数据库中检索所需列,而不是检索所有列,即使不需要它们。我们可以通过在 SELECT 语句中指定列名而不是使用 SELECT (*) 语句轻松做到这一点。

Example

假设我们已使用 CREATE TABLE 语句在 MySQL 数据库中创建了一个名为 CUSTOMERS 的表,如下所示 −

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

以下查询使用 INSERT 语句将值插入此表:

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

假设我们只想要 CUSTOMERS 表中的 ID、NAME 和 SALARY 列中的数据。因此,我们只应该在 SELECT 语句中指定那三列,如下所示:

SELECT ID, NAME, SALARY FROM CUSTOMERS;

Output

获得的输出如下所示 −

ID

NAME

SALARY

1

Ramesh

2000.00

2

Khilan

1500.00

3

Kaushik

2000.00

4

Chaitali

6500.00

5

Hardik

8500.00

6

Komal

4500.00

7

Muffy

10000.00

2. Use Wildcards

通配符 (%) 是我们用来根据模式搜索数据的字符。这些通配符与索引配对只提高了性能,因为数据库可以快速找到与模式匹配的数据。

Example

如果我们想要从 CUSTOMERS 表中检索所有以 K 开头的客户的姓名,则以下查询将提供最快的结果:

SELECT ID, NAME FROM CUSTOMERS WHERE NAME LIKE 'K%';

Output

以下是以上查询的输出:

ID

NAME

2

Khilan

3

Kaushik

6

Komal

3. Use Explicit Join

SQL 链接用于基于通用列合并两张表。有两种创建链接的方法:隐式链接和显式链接。显式链接符号在 ON 子句中使用 JOIN 关键字链接两张表,而隐式链接符号不使用 JOIN 关键字,而是使用 WHERE 子句。

从性能方面来说,它们都处于同一级别。然而,在更复杂的情况下,隐式链接符号可能会产生与预期完全不同的结果。因此,更喜欢显式链接。

4. Avoid using SELECT DISTINCT

SQL 中的 DISTINCT 运算符用于从数据库中检索唯一记录。在设计合理、具有唯一索引的数据库表上,我们很少会使用它。

但是,如果我们仍然必须在某个表上使用它,则使用 GROUP BY 子句代替 DISTINCT 关键字会展现出更好的查询性能(至少在某些数据库中是这样)。

5. Avoid using Multiple OR

OR 运算符用于在过滤数据库时组合多个条件。每当我们在过滤器条件中使用 OR 时,每个语句都会被单独处理。这会降低数据库性能,因为必须多次扫描整个表以检索与过滤器条件匹配的数据。

而我们可以使用更优化的解决方案;将不同的 OR 条件拆分为单独的查询,数据库可以并行处理这些查询。然后,可以使用 UNION 将这些查询的结果合并起来。

Example

例如,让我们假设我们要求获取所有年龄大于 25 岁或薪水大于 2000 的客户的详细信息。经过优化的查询如下所示:

SELECT ID, NAME FROM CUSTOMERS WHERE AGE > 25
UNION
SELECT ID, NAME FROM CUSTOMERS WHERE SALARY > 2000;

Output

执行上面的代码后,我们得到以下输出: -

ID

NAME

1

Ramesh

5

Hardik

4

Chaitali

6

Komal

7

Muffy

6. Use WHERE instead of HAVING

WHERE 子句和 HAVING 子句都用于在 SQL 中筛选数据。但是,WHERE 子句比 HAVING 更有效。使用 WHERE 子句,只会检索与条件匹配的记录。但使用 HAVING 子句,它会首先检索所有记录,然后根据条件对其进行筛选。因此,更推荐使用 WHERE 子句。

Database Defragmentation

当数据存储在数据库中时,它们被放置在连续的物理位置中。在这种情况下,逻辑位置和物理位置都按相同的顺序排列。

然而,当数据库表被更改(通过删除或更新记录),索引也会被更改以适应所做的更改。这会导致索引散布在存储空间中。物理位置也会失去连续分配。因此,数据库性能会下降。

碎片整理是解决此问题的办法。它将重新组织/重建索引的逻辑顺序,以匹配物理顺序。但是,此过程会首先分析索引,然后选择它们只需要被重新组织还是需要被彻底重建。

Built-In Tuning Tools

一些数据库提供了内置的调整工具来监视数据库性能。例如,Oracle 数据库提供了以下调整工具:

  1. EXPLAIN − 在 SQL 中,EXPLAIN 命令为我们提供了执行查询的顺序以及每个步骤的估计成本。我们可以使用它来找到最小成本的查询以优化数据库。

  2. tkprof − tkprof 是一条命令,它为我们提供了各种统计信息,例如 CPU 和查询的 I/O 使用情况。通过使用这些统计信息,我们可以调整我们的查询以减少 CPU 和 I/O 利用率,从而提高我们数据库的效率。