MySQL使用index_merge并且相交而不是ref和where

时间:2012-04-03 18:09:11

标签: mysql

我有一个查询在开发和生产(相同的数据库,相同的数据)上产生不同的优化器结果。

在我的机器上查询运行〜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-log

提前致谢

2 个答案:

答案 0 :(得分:1)

您可以尝试运行ANALYZE TABLE来更新统计信息,但我怀疑这取决于优化器的改进。您还可以尝试在查询中使用an index hint告诉MySQL不要使用index_activities_on_is_archived索引。无论如何,该指数的低基数可能对绩效有害。我会删除它。

答案 1 :(得分:0)

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