MySQL查询速度慢

时间:2009-08-15 08:39:15

标签: mysql performance explain

我在MySQL中有一个查询(在存储过程中使用),它按名称和另一个字段进行搜索。当我使用这些搜索参数的不同组合时,我得到快速结果(在1和2之间),但是对于某些特定值,我得到一个查询,需要9秒才能在生产网站上返回结果。 以下是我从EXPLAIN语句中得到的内容:

id, select_type, table, type, possible_keys, key,       key_len, ref,   rows, Extra
--------------------------------------------
1,  SIMPLE,      Names, ref,  IX_Name,       IX_Name,   17,      const, 3173, Using where

名称声明为varchar(40),另一个字段为Unsigned smallint(6)。我正在查询中使用的名称(IX_Name)的前15个字符上使用索引。我可以看到慢查询获得了大量的行来检查EXPLAIN输出的“rows”列。

我不确定我能做些什么来提高性能。上面的EXPLAIN输出有什么明显的错误吗?

谢谢, 添

4 个答案:

答案 0 :(得分:3)

你是如何填充表格的?索引是树结构并且为了有效地工作,它们需要平衡 - 如果以批量加载表或者应用常规维护,这将自动发生。如果这些都不成立,那么对于那些过度增长的树的那些部分,索引的效率会明显降低。

最简单的检查是删除索引并再次重新创建它。如果你之后有相同的行为,那就是别的,但至少可以消除这种可能性。

答案 1 :(得分:2)

您的查询似乎只使用一个字段的索引。您提到您按名称和“其他字段”进行搜索。 MySQL(特殊情况下最新版本除外)仅限于查询中每个表出现一个索引。这意味着如果你在其他字段上有名称和索引的索引,MySQL可能不得不猜测哪个索引最有用而忽略另一个索引。似乎更好的查询结构或索引定义会有所帮助。如果您的名字非常独特,并且您在解释计划中获得了3,000行,那么数据库中的元数据不是很好,或者您在其他字段上有很多其他可能性。

您可以发布表格的查询和架构吗?

对于同一个SQL,您的查询总是快速还是总是慢?也就是说,如果你搜索费舍尔,它有时它很快,有时它很慢或者它们是一致的。如果它们一致,则可能是由于CPU或磁盘活动。如果是变量,则可能是由于DB上的其他查询。

此外,根据您选择的内容,如果您可以将完整结果添加到索引中,您的查询将会启动,因为它不必点击磁盘来验证记录。通过“使用索引”查询,我获得了相当惊人的改进。

雅各

答案 2 :(得分:1)

好的,你有一个前缀索引。你使用前15个字符,但让我们假装你只用了1,你的表中有这些名称的值:

铝 倒钩 贝丝 贝特西 法案 比夫 短发 邦尼 巴克 芽 卡尔

由于我的索引仅在第一个字符上,因此数据库必须读取索引返回的所有行,并将每个整个名称与谓词进行比较。

现在,如果我查找'Al',我的索引会返回一行。然后我将preicate中的'Al'与行中的'Al'进行比较,我有一个匹配,所以我返回那一行,我就完成了。

现在,如果我寻找'Alex',我的索引会返回一行。然后我将“Alex”中的'Alex'与行中的'Al'进行比较,我没有匹配,也没有更多可能的匹配,我已经完成了。

但如果我寻找'Bud'(或任何以'B'开头的东西),我的索引会返回九行。在我完成之前,我需要阅读九行,并与谓词进行比较。

这样做:

select substring( name, 1, 15), count(*)
from names
group by substring( name, 1, 15);

我认为你会发现你的快速查找是独一无二的,而慢速查找则是许多名称共享一个共同前缀的地方。

答案 3 :(得分:0)

我发现3173行要考虑相当大的数字,假设您要将它们呈现给用户。如果检索到的实际记录数量要小得多,则应考虑创建更多索引。了解EXPLAIN针对不同搜索词报告的内容会很有用。