Comment optimiser MySQL Vues

J'ai quelques requêtes sur l'aide de points de vue, et ceux-ci s'exécutent beaucoup plus lent que je m'attends à donner tous les tableaux sont indexés (et pas que les grands de toute façon).

J'espère que je peux expliquer cela:

Ma Requête principale ressemble à ceci (grossièrement simplifié)

select [stuff] from orders as ord 
left join calc_order_status as ors on (ors.order_id = ord.id)

calc_order_status est un point de vue, défini ainsi:

create view calc_order_status as
select ord.id AS order_id,
(sum(itm.items * itm.item_price) + ord.delivery_cost) AS total_total
from orders ord 
left join order_items itm on itm.order_id = ord.id
group by ord.id

Commandes (ord) contiennent des ordres, order_items contenir les éléments individuels associés à chaque ordre et de leur prix.

Tous les tableaux sont indexés correctement, MAIS la chose s'exécute lentement et quand je fais l'EXPLIQUER, je reçois

  # id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
  1 1 PRIMARY ord ALL customer_id NULL NULL NULL 1002 Using temporary; Using filesort 
  2 1 PRIMARY <derived2> ALL NULL NULL NULL NULL 1002   
  3 1 PRIMARY cus eq_ref PRIMARY PRIMARY 4 db135147_2.ord.customer_id 1 Using where 
  4 2 DERIVED ord ALL NULL NULL NULL NULL 1002 Using temporary; Using filesort 
  5 2 DERIVED itm ref order_id order_id 4 db135147_2.ord.id 2   

Ma conjecture est, "derived2" se réfère à la vue. Les éléments individuels (imt) semblent bien fonctionner, indexés par ordre _ id. Le problème semble être la Ligne # 4, qui indique que le système n'utilise pas de clé pour la table commandes (ord). Mais dans la requête PRINCIPALE, l'id de la commande est déjà défini:
left join calc_order_status en tant que rup (régions ultrapériphériques.afin _ id = ord.id)
et ord.id (à la fois dans la requête principale et à l'intérieur de la vue) reportez-vous à la clé primaire.

J'ai lu quelque part que MySQL simpliy ne pas optimiser les points de vue que le bien et de ne pas utiliser de clé sous certaines conditions, même lorsqu'ils sont disponibles. Cela semble être un de ces cas.

Je vous serais reconnaissant de toutes les suggestions. Est-il un moyen pour forcer MySQL à réaliser "c'est plus simple que vous le pensez, il suffit d'utiliser la clé primaire et vous serez amende"? Ou sont les vues de la mauvaise façon d'aller à ce sujet?

InformationsquelleAutor jms | 2009-06-20