Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Join - Fatal编程技术网

Mysql 慢加入?空引用哪个更好

Mysql 慢加入?空引用哪个更好,mysql,join,Mysql,Join,我有两张桌子: CREATE TABLE `bb_index` ( `bb_id` smallint(5) unsigned NOT NULL, `object_id` bigint(10) unsigned NOT NULL, `in_object_id` bigint(10) unsigned NOT NULL, `f` int(10) unsigned DEFAULT NULL, `length` decimal(10,5) DEFAULT NULL, PRIMAR

我有两张桌子:

CREATE TABLE `bb_index` (
  `bb_id` smallint(5) unsigned NOT NULL,
  `object_id` bigint(10) unsigned NOT NULL,
  `in_object_id` bigint(10) unsigned NOT NULL,
  `f` int(10) unsigned DEFAULT NULL,
  `length` decimal(10,5) DEFAULT NULL,
  PRIMARY KEY (`bb_id`,`object_id`,`in_object_id`),
  KEY `in_obj_key` (`bb_id`,`in_object_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


CREATE TABLE `obj_bb_relation` (`bb_id` smallint(5) unsigned NOT NULL DEFAULT '0',
  `object_id` bigint(10) unsigned NOT NULL DEFAULT '0',
  `object_bb_f` int(11) unsigned DEFAULT NULL,
  PRIMARY KEY (`bb_id`,`object_id`),
  KEY `object_id` (`object_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
哪一个更好: 备选案文1:

SELECT object_id, f, length , object_bb_freq as C 
  FROM (select object_id, f, length 
          from bb_index use index (in_obj_key) 
         where bb_id = 14 
           and in_object_id = XXX
       ) as a join obj_bb_relation as b using (object_id)
说明:

备选案文2:

SELECT object_id, f, length, object_bb_f AS C 
  FROM bb_index AS a 
  JOIN obj_bb_relation AS b USING ( object_id ) 
 WHERE in_object_id = XXX 
   AND a.bb_id =YY 
   AND b.bb_id =YY 

还是


另一个选项..?

在大多数情况下,两者都是相同的。大多数数据库系统现在都有查询优化功能,可以从查询2、查询1自动进行查询优化。甚至是更好的。但如果您使用一些非常旧的或简化的数据库,则选项1更好。除了一些非常特殊的情况外,连接应该排在最后。

首先,您的查询几乎没有相似之处

SELECT object_id, f, length , object_bb_freq as C
FROM (select object_id, f, length
      from bb_index use index (in_obj_key)
      where bb_id = 14 and in_object_id = XXX) as a
join obj_bb_relation as b
     using (object_id)

SELECT object_id, f, length, object_bb_f AS C
FROM bb_index AS a
JOIN obj_bb_relation AS b
     USING ( object_id )
WHERE in_object_id = XXX AND a.bb_id =YY AND b.bb_id =YY 
翻译过程中丢失了非常重要的部分,即

  • bb_指数上的强制指数
  • b.bb_id上的过滤器
除此之外,因为您使用了ANSI内部连接形式,而不是逗号形式(
,来自bb_索引,obj_bb_关系WHERE..
),MySQL将根据需要洗牌WHERE和ON/USING子句,因为它们在语义上是相同的。这与子查询a无关,因为MySQL足够聪明,可以展开它


就个人而言,由于您在a.bb_id和b.bb_id上都有过滤器,如果您知道一个表只返回另一个表的1%记录,那么您可以使用经常被诟病的逗号符号(
来自bb_索引,obj_bb_关系,其中..
)因为MySQL将在加入到
obj\u bb\u关系之前处理
bb\u索引上的过滤器
——否则我通常使用扁平连接表单(选项2),因为它比选项1中的子查询更清晰

避免强制使用索引,如果可能的话。请在发布之前检查你的格式。如果我不强制索引,那么MySql使用索引合并,我认为它看起来更糟。我附上了我的解释信息。这是MySQL,感谢Tomalak Geret'kal修复了格式:)谢谢,基本上我一直在使用选项2——但现在当bb_索引表增长到大约50万行时,速度似乎非常慢。REF=NULL这一事实与此有关吗?bb_id上的过滤器只会将整个表格切割大约1/20,仅此而已