2012-04-03 58 views
0

我有一个查询,在开发和生产(相同的数据库,相同的数据)上产生不同的优化器结果。MySQL使用index_merge并相交而不是参考和其中

我的机器上查询运行在大约为5ms

对生产的查询中运行〜300-500ms

唯一的区别我能找到的是该行的EXPLAIN EXTENDED结果(和MySQL版本):

好的查询

*************************** 2. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: activities 
     type: ref 
possible_keys: index_activities_on_is_archived,index_activities_on_equipment_id,index_activities_on_date_completed,index_activities_on_shop_id 
      key: index_activities_on_shop_id 
     key_len: 5 
      ref: const 
     rows: 1127 
    filtered: 100.00 
     Extra: Using where 

坏查询

*************************** 2. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: activities 
     type: index_merge 
possible_keys: index_activities_on_is_archived,index_activities_on_equipment_id,index_activities_on_date_completed,index_activities_on_shop_id 
      key: index_activities_on_shop_id,index_activities_on_is_archived 
     key_len: 5,2 
      ref: NULL 
     rows: 1060 
     Extra: Using intersect(index_activities_on_shop_id,index_activities_on_is_archived); Using where 

我不知道该从哪里开始调试。这是MySQL版本和生产运行旧数据库的问题吗?

我的本地版本5.5.15 生产:5.0.95日志提前

感谢

回答

1

你可以尝试运行ANALYZE TABLE更新的统计数据,但我怀疑它是倒在优化器的改进。您也可以在查询中尝试使用an index hint来告诉MySQL不要使用index_activities_on_is_archived索引。无论如何,这个指数的低基数可能会对性能造成伤害。我会删除它。

0

它最终成为在生产中被禁用的查询缓存,这将解决问题。