我在MySQL JOIN语句中面临一些性能问题。它基本上是一个有许多行的帖子标签关系:大约100000个帖子和20000个标签。 不幸的是,查询花了太长时间,所以我正在寻求你的帮助。 在一个非常基本的查询中,我需要为每个帖子获取特定的帖子列和连接标签。事实上,真正的查询更复杂,但我可以从这里开始。
这是我的疑问:
SELECT
SQL_CALC_FOUND_ROWS null as rows,
posts.id,
posts.title
GROUP_CONCAT(tags.desc SEPARATOR ", ") as ptags
FROM posts
JOIN posts_tags ON posts_tags.id_post = posts.id
JOIN tags ON tags.id = posts_tags.id_tag
GROUP BY posts.id
ORDER BY posts.id DESC
LIMIT 0,20
这些是我的键定义
--- POSTS Table ----
PRIMARY KEY (`id`)
--- POSTS_TAGS Table ----
PRIMARY KEY (`id`),
KEY `id_post` (`id_post`),
KEY `id_tag` (`id_tag`)
--- TAGS Table ----
PRIMARY KEY (`id`)
这是我的第一篇文章,所以如果我错过了什么,我很抱歉。任何帮助将不胜感激。
****编辑****
添加了真实的表和查询。请注意,帖子现在名为Noticias , Posts_tags现在名为Tags_Noticias 。从PHPMyAdmin和JetProfiler添加了MySQL Explain。
CREATE TABLE IF NOT EXISTS `noticias` (
`id` int(9) NOT NULL AUTO_INCREMENT,
`volanta` varchar(150) DEFAULT NULL,
`titulo` varchar(250) NOT NULL,
`texto` text NOT NULL,
`fecha` datetime NOT NULL,
`fecha_modificado` datetime NOT NULL,
`id_autor` int(2) NOT NULL,
`id_seccion` int(2) NOT NULL,
`id_posicion` int(1) NOT NULL,
`publicado` int(1) NOT NULL DEFAULT '1',
`clave_primaria` varchar(30) DEFAULT NULL,
`url` varchar(500) NOT NULL,
`meta_titulo` varchar(100) NOT NULL,
`meta_descripcion` varchar(200) NOT NULL,
`redirect` int(1) NOT NULL,
`estado_seo` varchar(10) NOT NULL DEFAULT 'danger',
`geo_data` varchar(50) DEFAULT NULL,
`media_principal` varchar(500) NOT NULL,
PRIMARY KEY (`id`),
KEY `id_autor` (`id_autor`),
KEY `id_seccion` (`id_seccion`),
KEY `id_posicion` (`id_posicion`),
KEY `fecha` (`fecha`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=98560;
-
CREATE TABLE IF NOT EXISTS `tags` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`descripcion` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `descripcion` (`descripcion`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=21097 ;
-
CREATE TABLE IF NOT EXISTS `tags_noticias` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_tag` int(11) NOT NULL,
`id_noticia` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `id_noticia` (`id_noticia`),
KEY `id_tag` (`id_tag`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=284979 ;
-
SELECT
SQL_CALC_FOUND_ROWS null as rows,
noticias.id,
noticias.titulo,
noticias.fecha,
noticias.url,
noticias.publicado,
noticias.estado_seo,
GROUP_CONCAT(tags.descripcion SEPARATOR ", ") as ntags
FROM noticias
JOIN tags_noticias ON tags_noticias.id_noticia = noticias.id
JOIN tags ON tags.id = tags_noticias.id_tag
GROUP BY noticias.id
ORDER BY noticias.id DESC
LIMIT 0,20