2010-12-20 97 views
1

我有两个表A和表B. 表A包含100万(1,000,000)个记录和4个字段,而表2包含60,000和3个字段。 我正在运行一个查询,它连接这两个表并使用WHERE子句来查找诸如'%Bags%'之类的WHERE产品和'Bags%'e.t.c之类的产品的特定产品。优化MySQL查询/数据库

当我直接在phpMyAdmin中运行查询时,它会在大约1或2秒内返回记录。但是,当他们在网站上使用时,根据MySQL的“慢速查询”日志,他们有时需要9或10秒。事实上,我的网站响应速度很慢,所以经过调查,我发现这是由于我开始了解“慢速查询日志”而导致的。

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

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

我的表都使用PRIMARY键以及INDEXES。所以我想知道如何优化它们,或者有什么方法可以优化MySQL设置?

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

感谢

回答

4

对于所有的东西MySQL和性能有关,退房http://www.mysqlperformanceblog.com/

用EXPLAIN检查查询,看到herehere关于如何使用EXPLAIN作为查询诊断工具的信息。

只有索引是不够的。你是否在WHERE子句中搜索字段?你是否也有WHERE子句中使用的字段的索引(包括你在ORDER BY,GROUP BY和HAVING子句以及JOIN中提到的字段)?如果您在单个索引中分组了字段,那么除非您有查询将所有这些字段一起搜索,否则该索引不会被命中。如果您将索引中的字段分组,请确保索引实际上将用于查询(EXPLAIN是您的朋友)。也就是说,它可能还有很多其他的事情:配置不当的MySQL服务器,服务器调整不良,模式不正确。但是,您的查询和索引是开始调查的好地方。

Here是来自MySQL的Jay Pipes的性能最佳实践的不错总结。

+0

另外,正如其他人所暗示的,您的表现会因您网站的流量而异。如果您在非高峰时段在phpMyAdmin中运行查询,您显然会获得比在峰值流量时间内(或访客)运行查询时更好的性能。 – 2010-12-20 06:05:39

0

它,因为一些其他的查询是在当你要刷新你的网站的页面时运行。因此,例如,如果您的网站在页面刷新时运行8-10个查询,那么它将比您在phpmyadmin中运行单个查询花费更多的时间。如果它执行1-1.5分钟,那么它可能不是查询问题,但它也可能与服务器速度有关。

并且您还可以使用MATCH() AGAINST()声明来优化此类搜索查询。

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

只是检查出来。

感谢。

1

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

提高性能的唯一方法是使用fulltext indexes或获得sphinx进行搜索。

+0

是的我已经在此列上使用了FULLTEXT索引。 – Ali 2010-12-20 05:54:06

+1

@Ali:那你为什么不用'MATCH ... AGAINST'进行搜索? – zerkms 2010-12-20 05:56:31

0

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

看那DB模式,看看它是否有意义

大多数情况下,数据库有坏的设计和不归。这可能会极大地影响数据库的速度。作为一般情况,请学习3种标准格式并随时应用。第三范式以上的常规形式通常称为反规范化形式,但这实际上意味着它们违反了一些规则以使数据库更快。

我的建议是坚持第三范式,除非你是DBA(这意味着你知道后续表单并知道你在做什么)。第三次NF之后的标准化通常在以后进行,而不是在设计期间进行。

只能查询你真正需要的

过滤尽可能

你的where子句优化最重要的部分。

只选择字段,你需要

不要使用 “SELECT *” - 指定只有你所需要的领域;它会更快,并将使用更少的带宽。

小心加入

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

优化查询和存储过程(大部分程序已经运行)

查询的速度非常快。一般来说,即使使用连接,排序和计算,您也可以在不到一秒的时间内检索多条记录。作为一个经验法则,如果您的查询超过一秒钟,您可以优化它。

从最常用的查询开始,以及花费最多时间执行的查询。

添加,删除或修改索引

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

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

小心添加索引,因为它们需要由数据库维护。如果您在该字段上执行了许多更新,则维护索引可能需要比节省更多的时间。

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

移动查询到存储过程(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). 

删除不需要的意见

视图是特殊类型的查询 - 它们不是表格。它们是合乎逻辑的,而不是物理的,所以每次从MyView运行select *时,都会运行使视图和查询生效的查询。

如果您始终需要相同的信息,则视图可能会很好。

如果您必须过滤查看,就像在查询上运行查询 - 速度较慢。

调库设定

您可以调整DB在很多方面。更新优化器使用的统计信息,运行优化选项,使数据库只读等等。这需要更广泛的关于您使用的数据库的知识,并且主要由DBA完成。

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

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