MySQL查询速度很慢
这将返回与关键字匹配的链接。我有3个表:MySQL查询速度很慢,mysql,sql,Mysql,Sql,这将返回与关键字匹配的链接。我有3个表:链接,关键字,和关键字链接。keywords\u链接将关键字与链接链接起来 如何使此查询更有效?我对MySQL缺乏经验,所以我不得不使用基本的MySQL命令来创建这个查询 表格(仅显示相关信息): 链接: SELECT links.* FROM links INNER JOIN ( SELECT keywords_links.link_id FROM keywords_links INNER JOIN keywords ON keywords
链接
,关键字
,和关键字链接
。keywords\u链接
将关键字与链接链接起来
如何使此查询更有效?我对MySQL缺乏经验,所以我不得不使用基本的MySQL命令来创建这个查询
表格(仅显示相关信息):
链接:
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
关键词链接:
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 ;
关键词:
CREATE TABLE IF NOT EXISTS `keywords_links` (
`keyword_id` int(11) NOT NULL,
`link_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
编辑添加了DISTINCT以删除重复项查询本身正常。性能问题可能是它必须对
关键字\u链接进行全表扫描以匹配关键字,并对关键字进行全表扫描以查找匹配项
尝试将表结构更改为:
SELECT DISTINCT
l.*
FROM
links l
INNER JOIN keyworks_links kl ON kl.link_id = l.id
INNER JOIN keywords ON kl.keyword_id = k.id
WHERE
k.keyword IN ("facebook", "google", "apple")
;
这将加快关键字匹配的速度(您也可以使用创建索引
)
接下来,您可以更快地找到链接:
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`),
INDEX (keyword)
) ;
通过索引查找关键字的匹配项,然后通过索引查找链接,这两种方法的结合应该可以加快查询速度。为什么需要此处的分组方式。显示EXPLAIN
2。为每个表显示CREATE TABLE
。确保在on
和WHERE
子句中使用的所有列上都有索引。这可能不会影响性能,但是编写选择不同的关键字链接。link\u id
比使用按关键字分组\u链接更清晰。link\u id
@zerkms:我忘记了为什么要添加它(我很久以前写过这个查询),但是出于某种原因,删除它会使查询速度减慢33%。添加了CREATE TABLE
s,我不知道如何使用EXPLAIN
什么可以让它运行得更快?因为在原始格式中,他正在创建一个内联表(from中的subselect),然后将该内联表与links表连接起来。内联表将不使用索引进行连接,因此mysql将使用索引(如果必要)只是一个旁注:来自问题的查询保证嵌套查询中没有重复的link\u id
,而来自此答案的查询不会在innodb中立即启动,然后对于关键字
表,唯一的关键字
索引就足够了。所以总共只有两个索引:PK(id)
和唯一键(关键字)
@zerkms。你说得对。在这个问题中,语句是唯一排序(id,关键字)
,这是完全不同的。
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`),
INDEX (keyword)
) ;
CREATE TABLE IF NOT EXISTS `keywords_links` (
`keyword_id` int(11) NOT NULL,
`link_id` int(11) NOT NULL,
unique (keyword_id, link_id)
);