我有两个表TABLE A和TABLE B. 表A包含100万(1,000,000)条记录和4个字段,而表2包含60,000和3个字段。 我正在运行一个查询,它连接这两个表,并使用WHERE子句查找特定产品,如'%Bags%'等WHERE产品和'Bags%'e.t.c等产品。
当我直接在phpMyAdmin中运行查询时,它会在大约1或2秒内返回记录。但是当他们在网站上使用时,根据MySQL的“慢查询”日志,它们有时需要9或10秒。实际上我的网站响应有时非常慢,所以经过调查后我发现这是由于我开始了解“慢查询日志”。
慢查询日志包含所有执行超过long_query_time秒的SQL语句,并且至少需要检查min_examined_row_limit行。
因此根据上述查询的日志“query_time”是13秒,而在某些情况下,他们的“query_time”甚至超过了50秒。
我的表都使用PRIMARY键和INDEXES。所以我想知道如何更好地优化它们,还是有什么方法可以优化MySQL设置?
网站的这种缓慢不会一直发生,但有时(可能是一周一次)并持续约1或2分钟。它获得了不错的流量,还有很多其他查询,上面我发布的只是一个例子。
由于
答案 0 :(得分:4)
对于MySQL和性能相关的所有内容,请查看http://www.mysqlperformanceblog.com/
使用EXPLAIN检查您的查询,有关如何将EXPLAIN用作查询诊断工具的信息,请参阅here和here。
仅仅拥有索引是不够的。您是否在WHERE子句中索引搜索的字段?您是否还有WHERE子句中使用的字段的索引(包括您在ORDER BY,GROUP BY和HAVING子句以及JOIN中提到的字段)?如果您在单个索引中对字段进行了分组,则除非您有一个搜索所有这些字段的查询,否则不会命中该索引。如果您对索引中的字段进行分组,请确保它们实际上将在您的查询中使用索引(EXPLAIN是您的朋友)。
也就是说,它可能还有很多其他的东西:配置不当的MySQL服务器,调整不佳的服务器,糟糕的架构。但是您的查询和索引是开始调查的好地方。
Here是Jay Pipes of MySQL的性能最佳实践的一个很好的总结。
答案 1 :(得分:1)
like '%Bags%'
查询。
此处提高效果的唯一方法是使用fulltext indexes或获取sphinx进行搜索。
答案 2 :(得分:0)
由于其他一些查询是在您要刷新网站页面时运行的。因此,如果您的网站在页面刷新时运行8-10个查询,则需要比在phpmyadmin
中运行单个查询花费更多时间。如果它需要1-1.5分钟执行,那么它可能不是查询问题,但它可能也有服务器速度的问题。
您还可以使用MATCH() AGAINST()
语句来优化此类搜索查询。
否则您已经在使用PRIMARY KEY, INDEXES and JOINS
,因此无需担心其他问题。
看看吧。
感谢。
答案 3 :(得分:0)
有许多方法可以优化数据库和查询。我的方法如下。
查看数据库架构并查看它是否有意义
大多数情况下,数据库设计不好而且没有规范化。这可能会极大地影响数据库的速度。作为一般情况,学习3个普通表格并随时应用它们。第三范式以上的正常形式通常称为反规范化形式,但这实际上意味着它们破坏了一些规则以使数据库更快。
我建议坚持第3范式,除非你是DBA(这意味着你知道后续的形式,知道你在做什么)。第3次NF后的归一化通常在以后进行,而不是在设计时进行。
仅查询您真正需要的内容
尽可能过滤
您的Where子句是优化的最重要部分。
仅选择您需要的字段
永远不要使用"选择*" - 仅指定您需要的字段;它将更快,并将使用更少的带宽。
小心加入
加入时间很长。确保使用将两个表关联在一起的所有键,并且不要加入未使用的表 - 始终尝试加入索引字段。连接类型也很重要(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 *时,都会运行查询,在视图上生成视图和查询。
如果您总是需要相同的信息,那么观点可能会很好。
如果您必须过滤视图,就像在查询上运行查询一样 - 速度较慢。
调整数据库设置
您可以通过多种方式调整数据库。更新优化程序使用的统计信息,运行优化选项,使数据库成为只读等...这需要更广泛地了解您使用的数据库,并且主要由DBA完成。
****>使用查询分析器****
在许多数据库中,有一个用于运行和优化查询的工具。 SQL Server有一个名为查询分析器的工具,它对优化非常有用。您可以编写查询,执行它们,更重要的是,查看执行计划。您可以使用执行来了解SQL Server对您的查询执行的操作。