クエリによって異なります。ビューを使用すると、効率的に使用できるインデックスが制限されることがあります。
たとえば、テーブルを使用すると、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%'
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
と、次の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
のEXPLAIN
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
のEXPLAIN。
最高のインデックスは主にプライマリキーですが、ビューではこれを使用しません。
通常、データベースサーバーはインデックスを使用するのに十分スマートです。クエリの実行計画を見て、インデックスが使用されているかどうかを確認することができます。 –
MySQLでは、ビューから選択するときにインデックスが使用されているとは思われません。 – Kickstart
@ RobertKockどのように私のクエリの実行計画を見ることができますか? – buggy3