mysql - 复杂查询耗时 30 秒,无全表扫描

标签 mysql performance hibernate

我在 32 位机器上运行 MySQL 5.1,我使用 Hibernate 条件生成下面的查询;出于某种原因,我不明白执行需要 30 秒,即使根据“解释”所说的,没有执行全表扫描。

我们有完整的股票、stocks_groups、指标、indicator_definition(加上其他不那么相关的表,如国家、交易所...)。 stocks 表包含大约 18000 行,groups 表大约有 3000 行,indicators 表有超过 710,000 行。所有表都使用自动生成的 id 列,我在由(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,因为我不知道有任何其他方式可以以更易于使用的格式呈现它。

解释的输出:

"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,""

最佳答案

好的,这是一个相当大的查询,但是,它取决于每个表上的索引,如果您将 where 子句移动到 als1 表上的连接,这应该会有所帮助,因为目前您正在创建所有加入,然后在最后说“哦,我只想要这一点”

你能确认所有id字段都有索引吗?

关于mysql - 复杂查询耗时 30 秒,无全表扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5531112/

相关文章:

php - 为什么我的查询只更新奇数行

php - 从 PHP 框架转义 MySQL 中的字符

javascript - 为什么要缓存 jQuery 对象?

java - 如何手动处理Spring 4事务?

php - echo 两个表问题需要发布两次(mysql,php)

python - 获取 peewee ORM 中的最后一个插入 ID (python)

python - 为什么 Python 的数组很慢?

python - Pandas 重采样和插值功能太慢

java - 抽象类中的 Hibernate NamedQuery

java - 需要简单的方法来强制所有 DynaBean 属性名称为小写