我有一个查询在开发和生产(相同的数据库,相同的数据)上产生不同的优化器结果。
在我的机器上查询运行〜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
提前致谢
答案 0 :(得分:1)
您可以尝试运行ANALYZE TABLE来更新统计信息,但我怀疑这取决于优化器的改进。您还可以尝试在查询中使用an index hint告诉MySQL不要使用index_activities_on_is_archived
索引。无论如何,该指数的低基数可能对绩效有害。我会删除它。
答案 1 :(得分:0)
它最终成为生产中禁用的查询缓存,在此问题上解决问题。