即使正在使用索引,MySQL 也会在极少数情况下进行慢速查询

Posted

技术标签:

【中文标题】即使正在使用索引,MySQL 也会在极少数情况下进行慢速查询【英文标题】:MySQL slow query in rare cases even though index is being used 【发布时间】:2009-08-19 10:39:15 【问题描述】:

我在一个大型 mysql 表(>400 万行)中有一个查询。此查询用于存储过程,它按姓氏和另一个数字字段进行搜索。当我使用这些搜索参数的不同组合时,我会得到快速的结果(在 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、使用where

Suram 被声明为 varchar(40),而另一个字段是 unsigned smallint(6)。正在使用的索引是 IX_Name,它由 surname(15) 和 forename(10) 的前缀组成

我不确定我可以做些什么来提高性能。上面的 EXPLAIN 输出有什么明显的错误吗?该查询仅在姓氏和其他字段的罕见组合上运行缓慢,但它们始终是相同的慢查询。

我尝试删除所有索引并重新创建它们,但这并没有解决有问题的查询。

查询计划显示正在使用索引,并且对于不同的姓氏(以及其他数字字段的不同值),查询可以是即时的。但是,当我搜索姓氏“Fischer”和数字字段的特定值(这是一个特别慢的查询)时,它不喜欢。这可能是因为我的表中有许多“Fischer”匹配的名称吗? (约 3500)。但是在那种情况下,可以做些什么来优化这个查询呢?下面是我的表的架构。

namenumber: 主键,int,unsigned,not null,auto inc;姓氏:varchar(40);名字:varchar(40); f3: varchar(40); f4: varchar(40); f5: smallint(6),无符号; f6: smallint(6),无符号; f7: varchar(40); f8: varchar(40); f9:小整数(6); f10: varchar(10); f11:小整数(4); f12:smallint(6),无符号; f13: 文字

我正在运行的查询如下:

SELECT namenumber,surname,forename,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13
FROM names IGNORE INDEX (IX_IGNORE1,IX_IGNORE2,IX_IGNORE3)
WHERE ((surname = 'fischer')) AND (f12 = 270)
LIMIT 0,14

MySQL 使用以下索引 (IX_Name),该索引由以下字段组成:surname(15),forename(10),即 surname 的 15 个字符前缀和名字的 10 个字符前缀。

对于大多数查询,这非常快,但对于少数查询,返回结果到网页大约需要 9 秒,显示 EXPLAIN 的输出如上。

有什么想法吗?

提前致谢, TM

【问题讨论】:

【参考方案1】:

您是否尝试过仅使用姓氏来修改索引 IX_Name。索引可能会导致延迟 - 因为他根据姓氏和名字返回行(这不是您的查询的一部分)并且只需要真实列内容的两个部分 - 这需要时间来计算。

【讨论】:

啊,我认为可以使用索引的最左侧前缀是一个优势。问题是我希望能够处理用户也输入名字的情况。从来没有尝试过不索引名字...我会尝试删除它并测试它是如何进行的。感谢您的回复。

以上是关于即使正在使用索引,MySQL 也会在极少数情况下进行慢速查询的主要内容,如果未能解决你的问题,请参考以下文章

即使使用 FILE_FLAG_DELETE_ON_CLOSE 属性创建文件,文件也会留在磁盘上

mysql重点--正确使用

mysql失效的几种情况

即使没有发出预检请求,也会在 POST 请求中出现 CORS 错误

获取整个索引中的总词频(Elasticsearch)

Mysql 索引失效场景