Comment puis-je obtenir MySQL à utiliser un INDEX pour afficher la requête?

Je suis en train de travailler sur un projet web avec base de données MySql sur Java EE. Nous avons besoin d'une vue de synthétiser les données à partir de 3 tables avec plus de 3M de lignes dans l'ensemble. Chaque tableau a été créé avec l'index. Mais je n'ai pas trouvé le moyen de profiter des avantages dans les indices dans la condition de l'instruction select de récupération de la vue que nous avons créé avec [groupe par].

J'ai obtenir des suggestions des personnes qui à l'aide de points de vue dans MySql n'est pas une bonne idée. Parce que vous ne pouvez pas créer d'index pour les vues dans mysql comme dans oracle. Mais dans les quelques test que j'ai pris, les indices peuvent être utilisées en vue de l'instruction select. Peut-être que j'ai créé ces vues dans un mauvais sens.

Je vais utiliser un exemple pour décrire mon problème.

Nous avons une table qui enregistre les données pour des scores élevés dans des matchs de la NBA, avec l'index sur la colonne [happend_in]

CREATE  TABLE `highscores` (
   `tbl_id` int(11) NOT NULL auto_increment,
   `happened_in` int(4) default NULL,
   `player` int(3) default NULL,
   `score` int(3) default NULL,
   PRIMARY KEY  (`tbl_id`),
   KEY `index_happened_in` (`happened_in`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insérer des données(8 lignes)

INSERT INTO highscores(happened_in, player, score)
VALUES (2006, 24, 61),(2006, 24, 44),(2006, 24, 81),
(1998, 23, 51),(1997, 23, 46),(2006, 3, 55),(2007, 24, 34), (2008, 24, 37);

puis-je créer une vue pour voir le score le plus élevé que Kobe Bryant a obtenu au cours de chaque année

CREATE OR REPLACE VIEW v_kobe_highScores
AS
   SELECT player, max(score) AS highest_score, happened_in
   FROM highscores
   WHERE player = 24
   GROUP BY happened_in;

J'ai écrit une instruction conditionnelle pour voir le score le plus élevé que kobe obtenu dans 2006;

select * from v_kobe_highscores where happened_in = 2006;

Quand je l'ai expliquer dans toad for mysql, j'ai découvert que mysql dispose d'analyse toutes les lignes pour former la vue, puis de trouver des données de l'état, sans l'aide de l'index sur [happened_in].

explain select * from v_kobe_highscores where happened_in = 2006;

Comment puis-je obtenir MySQL à utiliser un INDEX pour afficher la requête?

Le point de vue que nous utilisons dans notre projet s'est construit entre les tables avec des millions de lignes. La numérisation de toutes les lignes de la table dans chaque vue de la récupération des données est inacceptable. S'il vous plaît aider! Merci!

@zerkms Voici le résultat que j'ai testé sur la vie réelle. Je ne vois pas beaucoup de différences entre les deux. Je pense que @spencer7593 a le point de droit. L'optimiseur MySQL ne pas "pousser" que prédicat dans l'avis de requête.
Comment puis-je obtenir MySQL à utiliser un INDEX pour afficher la requête?

InformationsquelleAutor Roger Ray | 2012-12-19