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?
Vous devez vous connecter pour publier un commentaire.
Si il est possible de supprimer ces jointures de les supprimer. En les remplaçant par subquerys va accélérer beaucoup.
vous pouvez également essayer de lancer quelque chose comme cela pour voir s'il a une quelconque différence de vitesse à tous.
Un index est utile pour trouver quelques lignes dans un tableau, mais lors d'une requête sur chaque ligne, un index ralentit les choses. Donc, ici, MySQL probablement s'attend à être à l'aide de l'ensemble [afin] de la table, donc il vaut mieux ne pas utiliser un index.
Vous pouvez essayer si il serait plus rapide par forcer MySQL à utiliser un indice: