我在一个大的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, Using where
Surame声明为varchar(40),另一个字段是unsigned smallint(6)。正在使用的索引是IX_Name,它由姓氏(15)和forename(10)的前缀组成
我不确定我能做些什么来提高性能。上面的EXPLAIN输出有什么明显的错误吗?该查询仅在姓氏和其他字段的罕见组合上运行缓慢,但它是一致的,因为它们始终是相同的慢查询。
我尝试删除所有索引并重新创建它们,但这并没有解决有问题的查询。
查询计划显示正在使用索引,并且在不同的姓氏(以及其他数字字段的各种值)上查询可以是即时的。但是,当我搜索姓氏“Fischer”和数字字段的特定值(这是一个特别慢的查询)时,它不喜欢。这可能是因为我的桌子上有很多“Fischer”匹配的名字吗? (约3500)。但在这种情况下,可以采取哪些措施来优化此查询?下面是我桌子的架构。
namenumber:Primary Key,int,unsigned,not null,auto inc;姓:varchar(40); forename:varchar(40); f3:varchar(40); f4:varchar(40); f5:smallint(6),unsigned; f6:smallint(6),unsigned; f7:varchar(40); f8:varchar(40); f9:smallint(6); f10:varchar(10); f11:tinyint(4); f12:smallint(6),unsigned; 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),即姓氏的15个char前缀和forename的10个char前缀。
对于大多数查询来说,这是非常快的,但对于罕见的查询,将结果返回到网页大约需要9秒,显示EXPLAIN的输出如上所述。
有什么想法吗?
提前致谢, TM
答案 0 :(得分:1)
您是否尝试仅使用姓氏修改索引IX_Name。索引可能会导致延迟 - 因为他根据姓氏和名字(不是您的查询的一部分)返回行,并且只需要实际列内容的两部分 - 这需要时间来计算。 / p>