2009-08-19 39 views
2

我在大型MySQL表(> 400万行)中查询。此查询用于存储过程,并按姓氏和其他数字字段进行搜索。当我使用这些搜索参数的不同组合时,我得到了快速结果(介于1到2s之间),但有一些特定值,我得到一个查询,它需要9s才能在生产网站上返回结果。下面是我得到了EXPLAIN语句:尽管正在使用索引,但很少出现MySQL缓慢查询

 
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),另一场是无符号的SMALLINT(6)。正在使用的指标是IX_Name它由姓(15),并用名字(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),无符号; f6:smallint(6),无符号; f7:varchar(40); f8:varchar(40); f9:smallint(6); f10:varchar(10); f11:tinyint(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),它包括以下字段:姓(15),名(10),即姓氏的15个字符前缀和姓氏的10个字符前缀。

对于大多数查询,这是非常快的,但对于那些罕见,大约需要9秒的成绩回报网页,显示如上解释的输出。

任何想法?

由于提前, TM

回答

1

你有没有试图修改仅使用姓的指数IX_Name。索引可能会导致延迟 - 因为他根据姓氏和名字(这不是查询的一部分)返回行,只需要实际列内容的一部分 - 这需要时间来计算。

+0

啊我认为这是一个优势,你可以使用索引的最左边的前缀。问题是,我希望能够处理用户也输入姓名时的情况。从来没有尝试没有索引的名字...我会尝试删除它并测试,看看它是如何去。感谢您的回复。 – TMM 2009-08-19 11:11:25