2016-05-25 5 views
1

は、私は2つのテーブルを持っていると仮定しますIDとインデックスはビューで動作しますか?

table1(ID, attribute1, attribute2)

table2(ID, attribute1, attribute2)は2台

の主キーであると私はビューを持っている:

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 
+0

通常、データベースサーバーはインデックスを使用するのに十分スマートです。クエリの実行計画を見て、インデックスが使用されているかどうかを確認することができます。 –

+0

MySQLでは、ビューから選択するときにインデックスが使用されているとは思われません。 – Kickstart

+0

@ RobertKockどのように私のクエリの実行計画を見ることができますか? – buggy3

答えて

2

「私は、クエリを次のようにクエリを実行すると、私は、(一般的には、私の場合はMySQLのSQLでの)主キーのインデックスの利点を使用することはできますか?」

MySQLは、基礎となるテーブルに定義されているインデックスの使用を検討します。ただし、ビューにインデックスを作成することはできません。詳細については、リンクmysql Restrictions on Viewsを確認してください。

ビューを使用してクエリでmysqlを使用すると、 "possible_keys"カラムの下にあると見なされるキーが表示されます。

EXPLAIN select * from myview where ID = 100; 
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は説明します: - 以下の

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。

最高のインデックスは主にプライマリキーですが、ビューではこれを使用しません。

+0

完全な答えがこれ以外の場所にあります - http://stackoverflow.com/questions/13944946/how-do-i-get-mysql表示用インデックスを使用する – Kickstart

+0

私は正直なところ、なぜこのサイトで気になるのかわかりません。 – Mjh

関連する問題