2010-06-22 7 views
0

Ceci est la requête (une requête de recherche essentiellement, sur la base des balises): -Comment optimiser cette requête mysql - expliquer la sortie inclus

select 
SUM(DISTINCT(ttagrels.id_tag in (2105,2120,2151,2026,2046))) as key_1_total_matches, td.*, u.* 
from Tutors_Tag_Relations AS ttagrels 
Join Tutor_Details AS td ON td.id_tutor = ttagrels.id_tutor 
JOIN Users as u on u.id_user = td.id_user 
where (ttagrels.id_tag in (2105,2120,2151,2026,2046)) group by td.id_tutor HAVING key_1_total_matches = 1 

Et voici la décharge de la base de données nécessaire pour exécuter cette requête: -

CREATE TABLE IF NOT EXISTS `Users` (
    `id_user` int(10) unsigned NOT NULL auto_increment, 
    `id_group` int(11) NOT NULL default '0', 

    PRIMARY KEY (`id_user`), 
    KEY `Users_FKIndex1` (`id_group`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=730 ; 

INSERT INTO `Users` (`id_user`, `id_group`) VALUES 
(303, 1); 


CREATE TABLE IF NOT EXISTS `Tutor_Details` (
    `id_tutor` int(10) unsigned NOT NULL auto_increment, 
    `id_user` int(10) NOT NULL default '0', 

    PRIMARY KEY (`id_tutor`), 
    KEY `Users_FKIndex1` (`id_user`), 
    KEY `id_user` (`id_user`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=58 ; 

INSERT INTO `Tutor_Details` (`id_tutor`, `id_user`) VALUES 
(26, 303); 


CREATE TABLE IF NOT EXISTS `Tags` (
    `id_tag` int(10) unsigned NOT NULL auto_increment, 
    `tag` varchar(255) default NULL, 
    PRIMARY KEY (`id_tag`), 
    UNIQUE KEY `tag` (`tag`), 
    KEY `id_tag` (`id_tag`), 
    KEY `tag_2` (`tag`), 
    KEY `tag_3` (`tag`), 
    KEY `tag_4` (`tag`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2957 ; 


INSERT INTO `Tags` (`id_tag`, `tag`) VALUES 
(2026, 'Brendan.\nIn'), 
(2046, 'Brendan.'), 
(2105, 'Brendan'), 
(2120, 'Brendan''s'), 
(2151, 'Brendan)'); 


CREATE TABLE IF NOT EXISTS `Tutors_Tag_Relations` (
    `id_tag` int(10) unsigned NOT NULL default '0', 
    `id_tutor` int(10) unsigned default NULL, 
    `tutor_field` varchar(255) default NULL, 
    `cdate` timestamp NOT NULL default CURRENT_TIMESTAMP, 
    `udate` timestamp NULL default NULL, 
    KEY `Tutors_Tag_Relations` (`id_tag`), 
    KEY `id_tutor` (`id_tutor`), 
    KEY `id_tag` (`id_tag`), 
    KEY `id_tutor_2` (`id_tutor`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `Tutors_Tag_Relations` (`id_tag`, `id_tutor`, `tutor_field`, `cdate`, `udate`) VALUES 
(2105, 26, 'firstname', '2010-06-17 17:08:45', NULL); 

ALTER TABLE `Tutors_Tag_Relations` 
    ADD CONSTRAINT `Tutors_Tag_Relations_ibfk_2` FOREIGN KEY (`id_tutor`) REFERENCES `Tutor_Details` (`id_tutor`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    ADD CONSTRAINT `Tutors_Tag_Relations_ibfk_1` FOREIGN KEY (`id_tag`) REFERENCES `Tags` (`id_tag`) ON DELETE NO ACTION ON UPDATE NO ACTION; 

Que fait la requête? Cette requête recherche réellement les tuteurs qui contiennent "Brendan" (comme leur nom ou leur biographie ou quelque chose comme ça). Les id_tags 2105,2120,2151,2026,2046 ne sont rien d'autre que les étiquettes qui ressemblent à "% Brendan%".

Ma question est: -

1.In l'expliquer de cette requête, la colonne de référence montre NULL pour ttagrels, mais il y a des clés possibles (Tutors_Tag_Relations, id_tutor, id_tag, id_tutor_2). Alors, pourquoi aucune clé n'est prise. Comment faire en sorte que la requête prenne des références. Est-ce possible? 2. Les deux autres tables td et u utilisent des références. Toute indexation nécessaire dans ceux-ci? Je crois que non.

Vérifiez l'expliquer de sortie de requête ici http://www.test.examvillage.com/explain.png

+2

Ajouter la sortie de EXPLAIN à votre message. – Naktibalda

+0

Pas exactement une réponse: mais vous mélangez différents encodages 'CHARSET' – DrColossos

+0

@Naktibalda Je pensais que les gens pouvaient lancer la sauvegarde et la requête d'explication. Mais de toute façon j'ai ajouté un lien vers la capture d'écran de la requête d'explication. S'il vous plaît vérifier http://www.test.examvillage.com/explain.png –

Répondre

0

Ne pas analyser les performances de base de données avec enregistrement unique dans le tableau. Créez au moins 100 enregistrements.