索引是否适用于视图?

时间:2016-05-25 08:37:44

标签: mysql sql

假设我有两张桌子:

table1(ID, attribute1, attribute2)

带有ID的

table2(ID, attribute1, attribute2)是两个表的主键

我有一个观点:

create view myview as
select ID, attribute1, attribute2 from table1
union
select ID, attribute1, attribute2 from table1

我可以使用主键索引的优势(在我的情况下一般是sql,对于我的情况下的mysql),当我执行如下查询的查询时?

select * from myview where ID = 100

2 个答案:

答案 0 :(得分:2)

“我可以利用主键索引(在一般的sql中,对于我的情况下的mysql),当我执行查询时,如下面的查询?”

MySQL将考虑使用已在基础表上定义的索引。但是,您无法在视图上创建索引。检查链接mysql Restrictions on Views以获得进一步说明。

使用视图对查询使用mysql说明将显示“possible_keys”列下正在考虑的键。

{{1}}

答案 1 :(得分:2)

这取决于您的查询。使用视图可能会限制可以有效使用的索引。

例如,使用一个我很方便的表,我可以使用2个UNIONed创建一个视图,每个视图都使用WHERE子句。

CREATE VIEW fred AS
SELECT *
FROM item
WHERE code LIKE 'a%'
UNION SELECT *
FROM item
WHERE mmg_code LIKE '01%'

代码和mmg_code字段都有索引。该表还将id作为主键(最高值约为59500)。

作为一个查询,我可以从视图中选择,或者进行类似于视图的查询,或者我可以使用OR(所有3应该给出相同的结果)。我得到3个完全不同的EXPLAIN: -

SELECT *
FROM item
WHERE id > 59000
AND code LIKE 'a%'
UNION SELECT *
FROM item
WHERE id > 59000
AND  mmg_code LIKE '01%';

给出和解释

id      select_type     table       type    possible_keys                                                       key         key_len ref     rows    Extra
1       PRIMARY         item        range   PRIMARY,code,id,id_mmg_code,id_code,code_id                         PRIMARY     4       NULL    508     Using where
2       UNION           item        range   PRIMARY,id,mmg_code,id_mmg_code,id_code,mmg_code_id                 PRIMARY     4       NULL    508     Using where
NULL    UNION RESULT    <union1,2>  ALL     NULL                                                                NULL        NULL    NULL    NULL    Using temporary

而以下

SELECT *
FROM item 
WHERE id > 59000
AND (code LIKE 'a%'
OR mmg_code LIKE '01%');

给出和解释

id      select_type     table       type    possible_keys                                                       key         key_len ref     rows    Extra
1       SIMPLE          item        range   PRIMARY,code,id,mmg_code,id_mmg_code,id_code,code_id,mmg_code_id    PRIMARY     4       NULL    508     Using where

以及

SELECT *
FROM fred
WHERE id > 59000;

给出和解释

id      select_type     table       type    possible_keys                                                       key         key_len ref     rows    Extra
1       PRIMARY         <derived2>  ALL     NULL                                                                NULL        NULL    NULL    4684    Using where
2       DERIVED         item        range   code,code_id                                                        code        34      NULL    1175    Using index condition
3       UNION           item        range   mmg_code,mmg_code_id                                                mmg_code    27      NULL    3509    Using index condition
NULL    UNION RESULT    <union2,3>  ALL     NULL                                                                NULL        NULL    NULL    NULL    Using temporary

正如您所看到的那样,索引已在视图中使用,它影响了从视图中选择时可以使用的索引。

最佳索引可能是主键,但视图不能使用它。