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.
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. –
In MySQL nein, ich glaube nicht, dass der Index verwendet wird, wenn Sie aus einer Ansicht auswählen. – Kickstart
@RobertKock Wie kann ich einen Ausführungsplan meiner Abfrage sehen? – buggy3