Mysql 关于比较两个指标:(a,b)和(a)
表t有两列Mysql 关于比较两个指标:(a,b)和(a),mysql,indexing,Mysql,Indexing,表t有两列 a varchr(50) not null b varchr(50) not null 可能有以下搜索场景 仅搜索指定a(例如foo1,foo2,…)(选择a,b,状态,计数(*),其中a在(xxx)组中由a,b,状态) 仅搜索指定b(例如,bar1,bar2,…)(选择a,b,状态,计数(*),其中b在(xxx)组中由a,b,状态) a和b都指定(选择a、b、状态、计数(*),其中a在(xxx)组中,b在(xxx)组中,由a、b、状态) 自然应该为a和b创建索引,例如 alt
a varchr(50) not null
b varchr(50) not null
可能有以下搜索场景
- 仅搜索指定a(例如
)(foo1,foo2,…
)选择a,b,状态,计数(*),其中a在(xxx)组中由a,b,状态
- 仅搜索指定b(例如,
)(bar1,bar2,…
)选择a,b,状态,计数(*),其中b在(xxx)组中由a,b,状态
- a和b都指定(
)选择a、b、状态、计数(*),其中a在(xxx)组中,b在(xxx)组中,由a、b、状态
alter table t add key idx_a_b (a,b);
alter table t add key idx_b (b);
但现在我想知道上面的指数和下面的指数有什么不同
alter table t add key idx_a (a);
alter table t add key idx_b (b);
我想如果有什么不同,也许可以忽略。我说得对吗?最佳索引位于
(a,b,状态)
和(b,状态)
这涵盖了所有三个查询,这意味着查询中的所有列都在索引中。对于前两个查询,这些也是最佳的
第三个是有问题的,因为子句中有两个
。MySQL中没有处理过滤的索引。如果我没有弄错的话,第一个示例将在您只查询a或查询a和b时使用。因此,它的效率会稍高一些,因为您只需要两个索引而不是3个,但是差异应该可以忽略不计。也许两者都尝试一下,做一些解释和分析。