1

我有两个表表 A 和表 B。表 A 包含 100 万(1,000,000)条记录和 4 个字段,而表 2 包含 60,000 和 3 个字段。我正在运行一个查询,它连接这两个表并使用 WHERE 子句查找特定产品,如 WHERE 产品,如 '%Bags%' 和产品,如'Bags%' 等

当我直接在 phpMyAdmin 中运行查询时,它会在大约 1 或 2 秒内返回记录。但是当它们在网站上使用时,根据 MySQL 的“慢查询”日志,它们有时需要 9 或 10 秒。实际上,我的网站响应有时非常慢,所以经过调查,我发现这是由于 MySQL 造成的,因为我了解了“慢查询日志”。

慢查询日志包含所有执行时间超过 long_query_time 秒且至少需要检查 min_examined_row_limit 行的 SQL 语句。

因此,根据该日志,上述查询的“query_time”为 13 秒,而在某些情况下,“query_time”甚至超过 50 秒。

我的两个表都使用主键和索引。所以我想知道如何进一步优化它们,或者有什么方法可以优化 MySQL 设置?

网站的这种缓慢并不总是发生,但有时(可能一周一次)并持续大约 1 或 2 分钟。它获得了可观的流量,并且还有许多其他查询,上面我发布的只是一个示例。

谢谢

4

4 回答 4

4

对于 MySQL 和性能相关的所有内容,请查看http://www.mysqlperformanceblog.com/

使用 EXPLAIN 检查您的查询,有关如何使用 EXPLAIN 作为查询诊断工具的信息,请参见此处此处。

仅有索引是不够的。您是否在索引 WHERE 子句中搜索的字段?您是否还有 WHERE 子句中使用的字段的索引(包括您在 ORDER BY、GROUP BY 和 HAVING 子句中提到的字段以及 JOIN)?如果您在单个索引中对字段进行了分组,那么除非您有一个同时搜索所有这些字段的查询,否则该索引不会被命中。如果您对索引中的字段进行分组,请确保它们实际上将在您的查询中使用索引(EXPLAIN 是您的朋友)。

也就是说,它也可能是许多其他事情:配置不当的 MySQL 服务器、调整不当的服务器、糟糕的架构。但是您的查询和索引是开始调查的好地方。

是 MySQL 的 Jay Pipes 对性能最佳实践的一个很好的总结。

于 2010-12-20T06:00:48.143 回答
1

like '%Bags%'无法使用索引优化查询。

此处提高性能的唯一方法是使用全文索引或使用sphinx进行搜索。

于 2010-12-20T05:45:30.543 回答
0

这是因为在您要刷新网站页面时会运行一些其他查询。因此,例如,如果您的网站在页面刷新时要运行 8-10 个查询,那么它会比您在phpmyadmin. 如果它需要 1-1.5 分钟来执行,那么它可能不是查询问题,但它也可能与服务器速度有关。

您还可以使用MATCH() AGAINST()语句来优化此类搜索查询。

否则您已经在使用PRIMARY KEY, INDEXES and JOINS,因此无需担心其他事情。

看看吧。

谢谢。

于 2010-12-20T05:45:24.440 回答
0

有很多方法可以优化数据库和查询。我的方法如下。

查看 DB Schema,看看它是否有意义

大多数情况下,数据库的设计很糟糕并且没有规范化。这会极大地影响数据库的速度。作为一般情况,学习 3 范式并始终应用它们。高于第 3 范式的范式通常称为反范式,但这真正意味着它们打破了一些规则以使数据库更快。

我建议坚持使用第三范式,除非您是 DBA(这意味着您知道后续表格并知道自己在做什么)。第 3 次 NF 之后的归一化通常在以后进行,而不是在设计期间进行。

只查询你真正需要的

尽可能过滤

您的 Where 子句是优化的最重要部分。

仅选择您需要的字段

永远不要使用“Select *”——只指定你需要的字段;它会更快,并且会使用更少的带宽。

小心连接

就时间而言,连接是昂贵的。确保使用将两个表关联在一起的所有键,并且不要连接到未使用的表 - 始终尝试连接索引字段。连接类型也很重要(INNER、OUTER、...)。

优化查询和存储过程(最先运行)

查询非常快。通常,您可以在不到一秒的时间内检索到许多记录,即使使用连接、排序和计算也是如此。根据经验,如果您的查询时间超过一秒,您可能可以对其进行优化。

从最常用的查询以及执行时间最长的查询开始。

添加、删除或修改索引

如果您的查询进行全表扫描,索引和适当的过滤可以解决通常非常耗时的过程。所有主键都需要索引,因为它们使连接更快。这也意味着所有表都需要一个主键。您还可以在 Where 子句中经常用于过滤的字段上添加索引。

你特别想在整数、布尔值和数字上使用索引。另一方面,您可能不想在 Blob、VarChars 和长字符串上使用索引。

添加索引时要小心,因为它们需要由数据库维护。如果您对该字段进行多次更新,则维护索引所花费的时间可能会比节省的时间多。

在 Internet 世界中,只读表非常普遍。当表为只读时,您可以添加负面影响较小的索引,因为索引不需要维护(或很少需要维护)。

将查询移至存储过程 (SP)

存储过程通常比查询更好更快,原因如下:

Stored Procedures are compiled (SQL Code is not), making them faster than SQL code.
SPs don't use as much bandwidth because you can do many queries in one SP. SPs also stay on the server until the final results are returned.
Stored Procedures are run on the server, which is typically faster.
Calculations in code (VB, Java, C++, ...) are not as fast as SP in most cases.
It keeps your DB access code separate from your presentation layer, which makes it easier to maintain (3 tiers model).

删除不需要的视图

视图是一种特殊类型的查询——它们不是表。它们是逻辑的而不是物理的,因此每次运行 select * from MyView 时,都会运行生成视图的查询和视图上的查询。

如果您总是需要相同的信息,那么视图可能会很好。

如果您必须过滤视图,这就像在查询上运行查询一样 - 它更慢。

调整数据库设置

您可以通过多种方式调整数据库。更新优化器使用的统计信息、运行优化选项、将数据库设为只读等……这需要对您使用的数据库有更广泛的了解,并且主要由 DBA 完成。

****> 使用查询分析器****

在许多数据库中,都有一个用于运行和优化查询的工具。SQL Server 有一个称为查询分析器的工具,它对优化非常有用。您可以编写查询、执行它们,更重要的是,查看执行计划。您可以使用执行来了解 SQL Server 对您的查询所做的工作。

于 2015-04-20T07:47:42.533 回答