MySQL 合并索引优化不起作用

MySQL Merge Index Optimization not working

我尝试在 MySQL 上模拟合并索引,就像这里说的 http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html 但我不知道为什么我不采用列类型 = 'index merge'.

我这里有结构table:

    create table hotel(
 index1 int not null,
  nume varchar(100),
  index2 int
);

CREATE UNIQUE INDEX hotel_index1 ON hotel (index1);
CREATE UNIQUE INDEX hotel_index2 ON hotel (index2);

insert into hotel(index1,nume,index2) values (1,'primu',1),
(2,'al2lea',2),(5,'al3lea',4),(4,'al4lea',5);

我 select 就像现场说的那样:

explain extended select * from hotel where index1 = 5 or index2 = 4;

解释的结果行是:

    id  select_type table   type    possible_keys                key         key_len    ref     rows    filtered    Extra
    1   SIMPLE      hotel   const   hotel_index1,hotel_index2   (null)      (null)      (null)  4        100        Using where

我对索引做错了什么,它们不像理论那样合并?

SQL 优化器在 or 优化方面真的很糟糕。另一种方法是使用 unionunion all。确切的等价物是:

select h.*
from hotel h
where h.index1 = 5 
union
select h.*
from hotel h
where index2 = 4;

这应该正确使用索引(假设表足够大以利用索引)。

注意:这里使用 union。如果不需要去重,那么就用union all.

编辑:

documentation 的评论很有见地:

The choice between different possible variants of the Index Merge access method and other access methods is based on cost estimates of various available options.

显然,成本估算不会引导优化器做出最佳选择。

我没有看到合并索引优化的答案是因为如果我使用 limit 这适用,因为那时 MySQL 将划分 or 组并尝试找到最佳索引并进行搜索,最后他合并了所有结果。

explain extended select * from hotel where index1 = 5 OR index2 = 4 limit 3;

我得到了很好的答案:

    id  select_type table   type        possible_keys                key                         key_len    ref         rows     filtered   Extra
    1   SIMPLE      hotel   index_merge hotel_index1,hotel_index2    hotel_index1,hotel_index2   4,5        (null)      2        100        Using union(hotel_index1,hotel_index2); Using where