SELECT links.*
FROM links
INNER JOIN (
SELECT keywords_links.link_id
FROM keywords_links
INNER JOIN keywords ON keywords_links.keyword_id = keywords.id
WHERE keywords.keyword
IN ("facebook", "google", "apple")
GROUP BY keywords_links.link_id
) t
ON links.id = t.link_id
Ceci renvoie les liens correspondant à un ou plusieurs mots-clés. J'ai 3 tables: links
, keywords
, et keywords_links
. Le keywords_links
relie les mots-clés aux liens.La requête MySQL est lente
Comment rendre cette requête plus efficace? Je suis inexpérimenté avec MySQL, j'ai donc dû utiliser des commandes MySQL de base pour créer cette requête.
Tableaux (uniquement des informations pertinentes affichées):
Liens:
CREATE TABLE IF NOT EXISTS `links` (
`id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=337789 ;
keywords_links:
CREATE TABLE IF NOT EXISTS `keywords_links` (
`keyword_id` int(11) NOT NULL,
`link_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mots-clés:
CREATE TABLE IF NOT EXISTS `keywords` (
`id` int(11) NOT NULL auto_increment,
`keyword` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `sort` (`id`,`keyword`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=60363 ;
Pourquoi avez-vous besoin de 'GROUP BY' ici? – zerkms
1. Afficher 'EXPLAIN' 2. Montrer' CREATE TABLE' pour chaque table. – zerkms
Assurez-vous que vous avez des index sur toutes les colonnes utilisées dans les clauses 'ON' et' WHERE'. – Barmar