我在32位机器上运行MySQL 5.1,我使用Hibernate标准来生成下面的查询;出于某种原因,我不能理解它需要30秒才能执行,即使根据“解释”所说的,没有执行全表扫描。
我们有一个完整的细节,股票,stocks_groups,指标,indicator_definition (加上其他不太相关的表,如国家,交易所...)。stocks表包含大约18000行,groups表包含大约3000行,indicators表包含超过710,000行。所有的表都使用自动生成的id列,并且我在indicators表中创建了一个额外的索引,该索引由(id,stock_id和definition_id)组成。如果我从查询中删除指示符,它将在0.030秒内执行,这是我所期望的,所以我猜一定有什么问题,但我对数据库的知识有点有限,我陷入了寻找解决方案的困境。
任何帮助都将不胜感激,
提前谢谢你,
哈比尔。
查询:
explain select
this_.id as id232_12_,
this_.created_on as created2_232_12_,
this_.updated_on as updated3_232_12_,
this_.version as version232_12_,
this_.autoupdate as autoupdate232_12_,
this_.bloomberg as bloomberg232_12_,
this_.currency_id as currency19_232_12_,
this_.cusip as cusip232_12_,
this_.disabled as disabled232_12_,
this_.exchange_id as exchange20_232_12_,
this_.isin as isin232_12_,
this_.name as name232_12_,
this_.price_composition as price11_232_12_,
this_.region_id as region21_232_12_,
this_.reuters as reuters232_12_,
this_.sedol as sedol232_12_,
this_.status_message_last_update as status14_232_12_,
this_.status_message_severity as status15_232_12_,
this_.status_message_text as status16_232_12_,
this_.ticker as ticker232_12_,
this_.trading_days_id as trading22_232_12_,
this_.type as type232_12_,
currency4_.id as id220_0_,
currency4_.created_on as created2_220_0_,
currency4_.updated_on as updated3_220_0_,
currency4_.version as version220_0_,
currency4_.code as code220_0_,
currency4_.long_name as long6_220_0_,
currency4_.short_name as short7_220_0_,
currency4_.symbol as symbol220_0_,
groups5_.stock_id as stock1_14_,
groups_als1_.id as group2_14_,
groups_als1_.id as id223_1_,
groups_als1_.created_on as created3_223_1_,
groups_als1_.updated_on as updated4_223_1_,
groups_als1_.version as version223_1_,
groups_als1_.active as active223_1_,
groups_als1_.alt_name as alt7_223_1_,
groups_als1_.code as code223_1_,
groups_als1_.locked as locked223_1_,
groups_als1_.name as name223_1_,
groups_als1_.parent_id as parent12_223_1_,
groups_als1_.position as position223_1_,
groups_als1_.primary_index_id as primary13_223_1_,
groups_als1_.type_id as type14_223_1_,
groups_als1_.kind as kind223_1_,
parent_als2_.id as id223_2_,
parent_als2_.created_on as created3_223_2_,
parent_als2_.updated_on as updated4_223_2_,
parent_als2_.version as version223_2_,
parent_als2_.active as active223_2_,
parent_als2_.alt_name as alt7_223_2_,
parent_als2_.code as code223_2_,
parent_als2_.locked as locked223_2_,
parent_als2_.name as name223_2_,
parent_als2_.parent_id as parent12_223_2_,
parent_als2_.position as position223_2_,
parent_als2_.primary_index_id as primary13_223_2_,
parent_als2_.type_id as type14_223_2_,
parent_als2_.kind as kind223_2_,
stock8_.id as id232_3_,
stock8_.created_on as created2_232_3_,
stock8_.updated_on as updated3_232_3_,
stock8_.version as version232_3_,
stock8_.autoupdate as autoupdate232_3_,
stock8_.bloomberg as bloomberg232_3_,
stock8_.currency_id as currency19_232_3_,
stock8_.cusip as cusip232_3_,
stock8_.disabled as disabled232_3_,
stock8_.exchange_id as exchange20_232_3_,
stock8_.isin as isin232_3_,
stock8_.name as name232_3_,
stock8_.price_composition as price11_232_3_,
stock8_.region_id as region21_232_3_,
stock8_.reuters as reuters232_3_,
stock8_.sedol as sedol232_3_,
stock8_.status_message_last_update as status14_232_3_,
stock8_.status_message_severity as status15_232_3_,
stock8_.status_message_text as status16_232_3_,
stock8_.ticker as ticker232_3_,
stock8_.trading_days_id as trading22_232_3_,
stock8_.type as type232_3_,
grouptype9_.id as id224_4_,
grouptype9_.created_on as created2_224_4_,
grouptype9_.updated_on as updated3_224_4_,
grouptype9_.version as version224_4_,
grouptype9_.name as name224_4_,
components10_.virtual_group_id as virtual2_14_,
components10_.group_id as group1_14_,
components10_.group_id as group1_225_5_,
components10_.virtual_group_id as virtual2_225_5_,
components10_.operator as operator225_5_,
components10_.operator_name as operator4_225_5_,
components10_.sequence as sequence225_5_,
indicators11_.stock_id as stock23_15_,
indicators11_.id as id15_,
indicators11_.id as id226_6_,
indicators11_.created_on as created3_226_6_,
indicators11_.updated_on as updated4_226_6_,
indicators11_.version as version226_6_,
indicators11_.definition_id as definition22_226_6_,
indicators11_.stock_id as stock23_226_6_,
indicators11_.dbl_delta1 as dbl6_226_6_,
indicators11_.dbl_value1 as dbl7_226_6_,
indicators11_.bool_delta1 as bool8_226_6_,
indicators11_.bool_value1 as bool9_226_6_,
indicators11_.bool_delta2 as bool10_226_6_,
indicators11_.bool_value2 as bool11_226_6_,
indicators11_.int_delta1 as int12_226_6_,
indicators11_.int_value1 as int13_226_6_,
indicators11_.dbl_delta2 as dbl14_226_6_,
indicators11_.dbl_value2 as dbl15_226_6_,
indicators11_.dbl_delta3 as dbl16_226_6_,
indicators11_.dbl_value3 as dbl17_226_6_,
indicators11_.date_set as date18_226_6_,
indicators11_.relative_id as relative24_226_6_,
indicators11_.is_support as is19_226_6_,
indicators11_.int_delta2 as int20_226_6_,
indicators11_.int_value2 as int21_226_6_,
indicators11_.type as type226_6_,
indicatord12_.id as id227_7_,
indicatord12_.created_on as created2_227_7_,
indicatord12_.updated_on as updated3_227_7_,
indicatord12_.version as version227_7_,
indicatord12_.code as code227_7_,
indicatord12_.descrip as descrip227_7_,
indicatord12_.format as format227_7_,
indicatord12_.name as name227_7_,
indicatord12_.numberformat as numberfo9_227_7_,
stock13_.id as id232_8_,
stock13_.created_on as created2_232_8_,
stock13_.updated_on as updated3_232_8_,
stock13_.version as version232_8_,
stock13_.autoupdate as autoupdate232_8_,
stock13_.bloomberg as bloomberg232_8_,
stock13_.currency_id as currency19_232_8_,
stock13_.cusip as cusip232_8_,
stock13_.disabled as disabled232_8_,
stock13_.exchange_id as exchange20_232_8_,
stock13_.isin as isin232_8_,
stock13_.name as name232_8_,
stock13_.price_composition as price11_232_8_,
stock13_.region_id as region21_232_8_,
stock13_.reuters as reuters232_8_,
stock13_.sedol as sedol232_8_,
stock13_.status_message_last_update as status14_232_8_,
stock13_.status_message_severity as status15_232_8_,
stock13_.status_message_text as status16_232_8_,
stock13_.ticker as ticker232_8_,
stock13_.trading_days_id as trading22_232_8_,
stock13_.type as type232_8_,
stockregio14_.id as id218_9_,
stockregio14_.created_on as created3_218_9_,
stockregio14_.updated_on as updated4_218_9_,
stockregio14_.version as version218_9_,
stockregio14_.code as code218_9_,
stockregio14_.name as name218_9_,
stockregio14_.group_id as group9_218_9_,
stockregio14_.type as type218_9_,
group15_.id as id223_10_,
group15_.created_on as created3_223_10_,
group15_.updated_on as updated4_223_10_,
group15_.version as version223_10_,
group15_.active as active223_10_,
group15_.alt_name as alt7_223_10_,
group15_.code as code223_10_,
group15_.locked as locked223_10_,
group15_.name as name223_10_,
group15_.parent_id as parent12_223_10_,
group15_.position as position223_10_,
group15_.primary_index_id as primary13_223_10_,
group15_.type_id as type14_223_10_,
group15_.kind as kind223_10_,
tradingday16_.id as id233_11_,
tradingday16_.created_on as created2_233_11_,
tradingday16_.updated_on as updated3_233_11_,
tradingday16_.version as version233_11_,
tradingday16_.traded_on_friday as traded5_233_11_,
tradingday16_.traded_on_monday as traded6_233_11_,
tradingday16_.traded_on_saturday as traded7_233_11_,
tradingday16_.traded_on_sunday as traded8_233_11_,
tradingday16_.traded_on_thursday as traded9_233_11_,
tradingday16_.traded_on_tuesday as traded10_233_11_,
tradingday16_.traded_on_wednesday as traded11_233_11_
from
stocks this_
left outer join
currencies currency4_
on this_.currency_id=currency4_.id
inner join
stocks_groups groups5_
on this_.id=groups5_.stock_id
inner join
groups groups_als1_
on groups5_.group_id=groups_als1_.id
inner join
groups parent_als2_
on groups_als1_.parent_id=parent_als2_.id
left outer join
stocks stock8_
on groups_als1_.primary_index_id=stock8_.id
left outer join
group_types grouptype9_
on groups_als1_.type_id=grouptype9_.id
left outer join
virtual_groups_components components10_
on groups_als1_.id=components10_.virtual_group_id
left outer join
indicators indicators11_
on this_.id=indicators11_.stock_id
left outer join
indicator_definitions indicatord12_
on indicators11_.definition_id=indicatord12_.id
left outer join
stocks stock13_
on indicators11_.relative_id=stock13_.id
inner join
regions stockregio14_
on this_.region_id=stockregio14_.id
left outer join
groups group15_
on stockregio14_.group_id=group15_.id
inner join
stock_trading_days tradingday16_
on this_.trading_days_id=tradingday16_.id
where
(
groups_als1_.id in (
208, 193, 224, 1745, 216, 1746, 1793, 218, 1747, 223, 204, 203, 209, 217, 1547, 1326, 127, 1744, 210, 212, 202, 1325, 2051, 215, 185, 1720, 197, 1721, 205, 1749, 194, 211, 195, 206, 1323, 184, 213, 220, 201, 207, 219, 1748, 196, 1071, 200
)
)
order by
parent_als2_.position asc,
groups_als1_.position asc,
this_.name asc;我将explain的结果粘贴为csv,因为我不知道还有什么其他方法可以用一种更易于使用的格式来表示它。
explain的输出:
"id","select_type","table","type","possible_keys","key","key_len","ref","rows","Extra"
1,"SIMPLE","groups_als1_","range","PRIMARY,FKB63DD9D428E54565","PRIMARY","8","",45,"Using where; Using temporary; Using filesort"
1,"SIMPLE","parent_als2_","eq_ref","PRIMARY","PRIMARY","8","pr2.groups_als1_.parent_id",1,""
1,"SIMPLE","stock8_","eq_ref","PRIMARY","PRIMARY","8","pr2.groups_als1_.primary_index_id",1,""
1,"SIMPLE","grouptype9_","eq_ref","PRIMARY","PRIMARY","8","pr2.groups_als1_.type_id",1,""
1,"SIMPLE","components10_","ref","FK91F4CE2D598958ED","FK91F4CE2D598958ED","8","pr2.groups_als1_.id",1,""
1,"SIMPLE","groups5_","ref","PRIMARY,FKA35A80369A4E438E,FKA35A8036A0A8A367,FKA35A8036CBAD0B70","FKA35A8036CBAD0B70","8","pr2.groups_als1_.id",4,"Using index"
1,"SIMPLE","tradingday16_","ALL","PRIMARY","","","",2,"Using join buffer"
1,"SIMPLE","this_","eq_ref","PRIMARY,FKCAD3EC1D1A5585AA,FKCAD3EC1DE15DC635","PRIMARY","8","pr2.groups5_.stock_id",1,"Using where"
1,"SIMPLE","currency4_","eq_ref","PRIMARY","PRIMARY","8","pr2.this_.currency_id",1,""
1,"SIMPLE","stockregio14_","eq_ref","PRIMARY","PRIMARY","8","pr2.this_.region_id",1,""
1,"SIMPLE","group15_","eq_ref","PRIMARY","PRIMARY","8","pr2.stockregio14_.group_id",1,""
1,"SIMPLE","indicators11_","ref","FKDC680444A0A8A367","FKDC680444A0A8A367","9","pr2.groups5_.stock_id",21,""
1,"SIMPLE","indicatord12_","eq_ref","PRIMARY","PRIMARY","8","pr2.indicators11_.definition_id",1,""
1,"SIMPLE","stock13_","eq_ref","PRIMARY","PRIMARY","8","pr2.indicators11_.relative_id",1,""发布于 2011-04-04 01:21:08
好吧,这是一个相当大的查询,然而,它将依赖于每个表上的索引,如果您将where子句移动到als1表上的连接,这应该会有所帮助,因为目前您正在创建所有连接的母亲,然后在最后说“哦,我只想要这一点”。
你能确认所有的id字段都有索引吗?
发布于 2011-04-04 04:37:58
我只能假设每个表的“自增”列"ID“分别有一个索引。此外,我会确保Stock_Groups表在Group_ID上有索引...在virtual_groups_components上,virtual_group_id上的指标索引,stock_id上的指数
此外,由于您有如此多的连接组合,查询优化器可能会试图为您考虑太多应该首先使用哪个表,并得到一个糟糕的结果。我已经对表进行了排序,并将您的"Groups“表(别名1版本)移到了顶部,因为这是WHERE子句的基础。此外,我还添加了"STRAIGHT_JOIN“子句,它告诉编译器按照列出的确切顺序运行查询……因此,将首先查询"groups_als1_“版本,并应用where,获取您期望的最小记录集,然后连接到所有其他查找表以获得结果……显然,替换我的占位符"AllYourFields“。我会对结果感兴趣的。我以前已经用15+查找表对14+百万条记录进行了数据挖掘,并将查询从失败的30+小时减少到不到2小时(是的,检索和排序所有记录)。
SELECT STRAIGHT_JOIN
PrimaryQuery.*,
currency4_.id as id220_0_,
currency4_.created_on as created2_220_0_,
currency4_.updated_on as updated3_220_0_,
currency4_.version as version220_0_,
currency4_.code as code220_0_,
currency4_.long_name as long6_220_0_,
currency4_.short_name as short7_220_0_,
currency4_.symbol as symbol220_0_,
indicators11_.stock_id as stock23_15_,
indicators11_.id as id15_,
indicators11_.id as id226_6_,
indicators11_.created_on as created3_226_6_,
indicators11_.updated_on as updated4_226_6_,
indicators11_.version as version226_6_,
indicators11_.definition_id as definition22_226_6_,
indicators11_.stock_id as stock23_226_6_,
indicators11_.dbl_delta1 as dbl6_226_6_,
indicators11_.dbl_value1 as dbl7_226_6_,
indicators11_.bool_delta1 as bool8_226_6_,
indicators11_.bool_value1 as bool9_226_6_,
indicators11_.bool_delta2 as bool10_226_6_,
indicators11_.bool_value2 as bool11_226_6_,
indicators11_.int_delta1 as int12_226_6_,
indicators11_.int_value1 as int13_226_6_,
indicators11_.dbl_delta2 as dbl14_226_6_,
indicators11_.dbl_value2 as dbl15_226_6_,
indicators11_.dbl_delta3 as dbl16_226_6_,
indicators11_.dbl_value3 as dbl17_226_6_,
indicators11_.date_set as date18_226_6_,
indicators11_.relative_id as relative24_226_6_,
indicators11_.is_support as is19_226_6_,
indicators11_.int_delta2 as int20_226_6_,
indicators11_.int_value2 as int21_226_6_,
indicators11_.type as type226_6_,
indicatord12_.id as id227_7_,
indicatord12_.created_on as created2_227_7_,
indicatord12_.updated_on as updated3_227_7_,
indicatord12_.version as version227_7_,
indicatord12_.code as code227_7_,
indicatord12_.descrip as descrip227_7_,
indicatord12_.format as format227_7_,
indicatord12_.name as name227_7_,
indicatord12_.numberformat as numberfo9_227_7_,
stock13_.id as id232_8_,
stock13_.created_on as created2_232_8_,
stock13_.updated_on as updated3_232_8_,
stock13_.version as version232_8_,
stock13_.autoupdate as autoupdate232_8_,
stock13_.bloomberg as bloomberg232_8_,
stock13_.currency_id as currency19_232_8_,
stock13_.cusip as cusip232_8_,
stock13_.disabled as disabled232_8_,
stock13_.exchange_id as exchange20_232_8_,
stock13_.isin as isin232_8_,
stock13_.name as name232_8_,
stock13_.price_composition as price11_232_8_,
stock13_.region_id as region21_232_8_,
stock13_.reuters as reuters232_8_,
stock13_.sedol as sedol232_8_,
stock13_.status_message_last_update as status14_232_8_,
stock13_.status_message_severity as status15_232_8_,
stock13_.status_message_text as status16_232_8_,
stock13_.ticker as ticker232_8_,
stock13_.trading_days_id as trading22_232_8_,
stock13_.type as type232_8_,
group15_.id as id223_10_,
group15_.created_on as created3_223_10_,
group15_.updated_on as updated4_223_10_,
group15_.version as version223_10_,
group15_.active as active223_10_,
group15_.alt_name as alt7_223_10_,
group15_.code as code223_10_,
group15_.locked as locked223_10_,
group15_.name as name223_10_,
group15_.parent_id as parent12_223_10_,
group15_.position as position223_10_,
group15_.primary_index_id as primary13_223_10_,
group15_.type_id as type14_223_10_,
group15_.kind as kind223_10_
FROM
( SELECT STRAIGHT_JOIN
groups_als1_.id as group2_14_,
groups_als1_.id as id223_1_,
groups_als1_.created_on as created3_223_1_,
groups_als1_.updated_on as updated4_223_1_,
groups_als1_.version as version223_1_,
groups_als1_.active as active223_1_,
groups_als1_.alt_name as alt7_223_1_,
groups_als1_.code as code223_1_,
groups_als1_.locked as locked223_1_,
groups_als1_.name as name223_1_,
groups_als1_.parent_id as parent12_223_1_,
groups_als1_.position as position223_1_,
groups_als1_.primary_index_id as primary13_223_1_,
groups_als1_.type_id as type14_223_1_,
groups_als1_.kind as kind223_1_,
parent_als2_.id as id223_2_,
parent_als2_.created_on as created3_223_2_,
parent_als2_.updated_on as updated4_223_2_,
parent_als2_.version as version223_2_,
parent_als2_.active as active223_2_,
parent_als2_.alt_name as alt7_223_2_,
parent_als2_.code as code223_2_,
parent_als2_.locked as locked223_2_,
parent_als2_.name as name223_2_,
parent_als2_.parent_id as parent12_223_2_,
parent_als2_.position as position223_2_,
parent_als2_.primary_index_id as primary13_223_2_,
parent_als2_.type_id as type14_223_2_,
parent_als2_.kind as kind223_2_,
groups5_.stock_id as stock1_14_,
this_.id as id232_12_,
this_.created_on as created2_232_12_,
this_.updated_on as updated3_232_12_,
this_.version as version232_12_,
this_.autoupdate as autoupdate232_12_,
this_.bloomberg as bloomberg232_12_,
this_.currency_id as currency19_232_12_,
this_.cusip as cusip232_12_,
this_.disabled as disabled232_12_,
this_.exchange_id as exchange20_232_12_,
this_.isin as isin232_12_,
this_.name as name232_12_,
this_.price_composition as price11_232_12_,
this_.region_id as region21_232_12_,
this_.reuters as reuters232_12_,
this_.sedol as sedol232_12_,
this_.status_message_last_update as status14_232_12_,
this_.status_message_severity as status15_232_12_,
this_.status_message_text as status16_232_12_,
this_.ticker as ticker232_12_,
this_.trading_days_id as trading22_232_12_,
this_.type as type232_12_,
stockregio14_.id as id218_9_,
stockregio14_.created_on as created3_218_9_,
stockregio14_.updated_on as updated4_218_9_,
stockregio14_.version as version218_9_,
stockregio14_.code as code218_9_,
stockregio14_.name as name218_9_,
stockregio14_.group_id as group9_218_9_,
stockregio14_.type as type218_9_,
tradingday16_.id as id233_11_,
tradingday16_.created_on as created2_233_11_,
tradingday16_.updated_on as updated3_233_11_,
tradingday16_.version as version233_11_,
tradingday16_.traded_on_friday as traded5_233_11_,
tradingday16_.traded_on_monday as traded6_233_11_,
tradingday16_.traded_on_saturday as traded7_233_11_,
tradingday16_.traded_on_sunday as traded8_233_11_,
tradingday16_.traded_on_thursday as traded9_233_11_,
tradingday16_.traded_on_tuesday as traded10_233_11_,
tradingday16_.traded_on_wednesday as traded11_233_11_,
stock8_.id as id232_3_,
stock8_.created_on as created2_232_3_,
stock8_.updated_on as updated3_232_3_,
stock8_.version as version232_3_,
stock8_.autoupdate as autoupdate232_3_,
stock8_.bloomberg as bloomberg232_3_,
stock8_.currency_id as currency19_232_3_,
stock8_.cusip as cusip232_3_,
stock8_.disabled as disabled232_3_,
stock8_.exchange_id as exchange20_232_3_,
stock8_.isin as isin232_3_,
stock8_.name as name232_3_,
stock8_.price_composition as price11_232_3_,
stock8_.region_id as region21_232_3_,
stock8_.reuters as reuters232_3_,
stock8_.sedol as sedol232_3_,
stock8_.status_message_last_update as status14_232_3_,
stock8_.status_message_severity as status15_232_3_,
stock8_.status_message_text as status16_232_3_,
stock8_.ticker as ticker232_3_,
stock8_.trading_days_id as trading22_232_3_,
stock8_.type as type232_3_,
grouptype9_.id as id224_4_,
grouptype9_.created_on as created2_224_4_,
grouptype9_.updated_on as updated3_224_4_,
grouptype9_.version as version224_4_,
grouptype9_.name as name224_4_,
components10_.virtual_group_id as virtual2_14_,
components10_.group_id as group1_14_,
components10_.group_id as group1_225_5_,
components10_.virtual_group_id as virtual2_225_5_,
components10_.operator as operator225_5_,
components10_.operator_name as operator4_225_5_,
components10_.sequence as sequence225_5_
from
groups groups_als1_
join groups parent_als2_
on groups_als1_.parent_id = parent_als2_.id
join stocks_groups groups5_
on groups_als1_.id = groups5_.group_id
join stocks this_
on groups5_.stock_id = this_.id
join regions stockregio14_
on this_.region_id = stockregio14_.id
join stock_trading_days tradingday16_
on this_.trading_days_id = tradingday16_.id
left outer join stocks stock8_
on groups_als1_.primary_index_id = stock8_.id
left outer join group_types grouptype9_
on groups_als1_.type_id=grouptype9_.id
left outer join virtual_groups_components components10_
on groups_als1_.id=components10_.virtual_group_id
where
groups_als1_.id in ( 208, 193, 224, 1745, 216, 1746,
1793, 218, 1747, 223, 204, 203, 209, 217, 1547,
1326, 127, 1744, 210, 212, 202, 1325, 2051, 215,
185, 1720, 197, 1721, 205, 1749, 194, 211, 195,
206, 1323, 184, 213, 220, 201, 207, 219, 1748,
196, 1071, 200 )
order by
parent_als2_.position asc,
groups_als1_.position asc,
this_.name asc; ) PrimaryQuery
left outer join currencies currency4_
on PrimaryQuery.currency19_232_12_ = currency4_.id
left outer join indicators indicators11_
on PrimaryQuery.id232_12_ = indicators11_.stock_id
left outer join indicator_definitions indicatord12_
on indicators11_.definition_id = indicatord12_.id
left outer join stocks stock13_
on indicators11_.relative_id = stock13_.id
join regions stockregio14_
on PrimaryQuery.region21_232_12_ = stockregio14_.id
left outer join groups group15_
on stockregio14_.group_id = group15_.id
left outer join stocks stock8_
on PrimaryQuery.primary13_223_1_ = stock8_.id 发布于 2011-04-04 01:14:29
请尝试将WHERE条件作为联接条件的一部分。
编辑:我不知道你是否可以强制Hibernate这样做
https://stackoverflow.com/questions/5531112
复制相似问题