>假设我有两个表:
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 个 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 个完全不同的解释:-
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
如您所见,由于索引已在视图中使用,它影响了从视图中选择时可以使用的索引。
最佳索引可能是主键,但视图不使用它。
"当我执行类似以下查询的查询时,我可以使用主键索引的优势(一般在 sql 中,在我的情况下为 mysql)吗?"
MySQL将考虑使用已在底层表上定义的索引。但是,不能在视图上创建索引。检查链接 mysql 视图限制 以获得进一步的解释。
使用视图对查询使用 mysql 解释将在"possible_keys"列下显示正在考虑的键。
EXPLAIN select * from myview where ID = 100;