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上的过滤器
,来自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,仅此而已