Sql 简明教程
SQL - Database Tuning
SQL Database Tuning
SQL 数据库调整是优化数据库防止其成为瓶颈的一组活动。
有各种技术可用来配置特定数据库的最佳性能。数据库调整与查询调整有重叠;因此,良好索引和避免不当查询有助于提高数据库效率。此外,增加存储量、更新到最新数据库版本以及投资更强大的 CPU(如果需要)也都是一些常用技术。
Database Tuning Techniques
我们可以实施以下技术来优化数据库性能:
Database Normalization
规范化是消除数据库中重复数据的过程。我们可以通过将大型表分解成较小的相关表格来规范化数据库。这提高了数据库的性能,因为它检索数据需要更少的时间,而不是一个大表。
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 子句。