Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询速度很慢_Mysql_Sql - Fatal编程技术网

MySQL查询速度很慢

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

这将返回与关键字匹配的链接。我有3个表:
链接
关键字
,和
关键字链接
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)
);