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
优化方面真的很糟糕。另一种方法是使用 union
或 union 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
我尝试在 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
优化方面真的很糟糕。另一种方法是使用 union
或 union 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