2016-05-25 10 views
1

Nehmen wir an, ich habe zwei Tabellen:Funktioniert der Index mit View?

table1(ID, attribute1, attribute2) und

table2(ID, attribute1, attribute2) mit ID ist Primärschlüssel von zwei Tisch

und ich habe einen Blick:

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

Kann ich die Vorteile der Nutzung von Index des Primärschlüssels (in SQL im Allgemeinen und für mysql in meinem Fall), wenn ich Abfrage wie folgende Abfrage ausführe?

select * from myview where ID = 100 
+0

Normalerweise ist ein Datenbankserver intelligent genug, um die Indizes zu verwenden.Sie können versuchen, sich den Ausführungsplan Ihrer Abfrage anzusehen und festzustellen, ob sie die Indizes verwendet. –

+0

In MySQL nein, ich glaube nicht, dass der Index verwendet wird, wenn Sie aus einer Ansicht auswählen. – Kickstart

+0

@RobertKock Wie kann ich einen Ausführungsplan meiner Abfrage sehen? – buggy3

Antwort

2

„Kann ich die Vorteile des Index des Primärschlüssels verwenden (in SQL im Allgemeinen und für mysql in meinem Fall), wenn ich Abfrage ausführen, wie Abfrage zu folgen?“

MySQL berücksichtigt die Verwendung von Indizes, die für die zugrunde liegenden Tabellen definiert wurden. Sie können jedoch keinen Index für die Ansicht erstellen. Überprüfen Sie den Link mysql Restrictions on Views für weitere Erläuterungen.

Wenn Sie mysql explain für eine Abfrage mit der Ansicht verwenden, werden die Schlüssel angezeigt, die in der Spalte "possible_keys" berücksichtigt werden.

EXPLAIN select * from myview where ID = 100; 
2

Es hängt von Ihrer Abfrage ab. Die Verwendung einer Sicht kann die Indizes einschränken, die effizient verwendet werden können.

Zum Beispiel mit einer Tabelle habe ich handlich Ich kann eine Sicht erstellen mit 2 UNIONed wählt jede mit einer WHERE-Klausel.

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

Sowohl der Code als auch die mmg_code-Felder haben Indizes. Die Tabelle hat auch eine ID als Primärschlüssel (der höchste Wert ist etwa 59500).

Als Abfrage kann ich aus der Ansicht auswählen, oder eine Abfrage ähnlich der Ansicht, oder ich kann ein OR verwenden (alle 3 sollten die gleichen Ergebnisse). Ich bekomme 3 ganz anders erklärt: -

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

gibt und EXPLAIN von

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 

während der folgenden

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

gibt und EXPLAIN von

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 

und die folgenden

SELECT * 
FROM fred 
WHERE id > 59000; 

gibt und EXPLAIN von

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 

Wie Sie sehen können, wie Indizes hat in der Ansicht verwendet worden, um die Indizes betroffen, die verwendet werden können, wenn aus der Sicht auswählen.

Der beste Index ist möglicherweise der Primärschlüssel, aber die Ansicht verwendet dies nicht.

+0

Eine vollständige Antwort gibt es woanders - http://stackoverflow.com/questions/13944946/how-do-i-get-mysql to-use-an-index-for-view-query – Kickstart

+0

Ich weiß ehrlich nicht, warum ich mich manchmal sogar mit dieser Seite beschäftige .. – Mjh