mysql join:啥更快? [关闭]
Posted
技术标签:
【中文标题】mysql join:啥更快? [关闭]【英文标题】:mysql join: what is faster? [closed]mysql join:什么更快? [关闭] 【发布时间】:2012-10-28 15:37:55 【问题描述】:我的表:big_table
+------+--------------+------+---+ ---------+----------------+ |领域 |类型 |空 |钥匙 |默认 |额外 | +-----------------+--------------+------+-----+--- ------+----------------+ |编号 |中型(7) |否 |优先级 |空 |自动增量 | |标题 | varchar(255) |否 | |空 | | |类别 ID |小整数(2) |否 | |空 | | | sub_category_id |小整数(2) |否 | |空 | | |宽度 |小整数(5) |否 | |空 | | |身高 |小整数(5) |否 | |空 | | | ratio_width |小整数(5) |否 | |空 | | | ratio_height |小整数(5) |否 | |空 | | |尺寸 |整数(8) |否 | |空 | | |哑剧 |小整数(2) |否 | |空 | | |意见 |中型(7) |否 |穆尔 |空 | | |时间 |整数(10) |否 | |空 | | |文件 | varchar(255) |否 | |空 | | +-----------------+--------------+------+-----+--- ------+----------------+
小表
+--------+-------------+------+-----+---------+-- -----+ |领域 |类型 |空 |钥匙 |默认 |额外 | +--------+-------------+------+-----+---------+-- -----+ |编号 |中型(7) |否 |优先级 |空 | | |宽度 |小整数(5) |否 |穆尔 |空 | | |身高 |小整数(5) |否 |穆尔 |空 | | +--------+-------------+------+-----+---------+-- -----+那么更快(示例):
SELECT * FROM `big_table` WHERE `width` =1920 AND `height`=1080;
或使用连接
select big_table.*
from small_table
left join small_table small_table2
ON (small_table.id=small_table2.id
and `small_table`.`height` = '1080')
left join big_table
ON (big_table.id=small_table.id)
where small_table.width = '1920';
还是加入同一张表?
select big_table.*
from big_table as big_table1
left join big_table big_table2
ON (big_table1.id=big_table2.id and `big_table1`.`height` = '1080')
left join big_table
ON (big_table.id=big_table1.id)
where big_table1.width = '1920';
或者有更好的解决方案,更好的选择? (在两个表上我都可以使用索引(宽度和高度),但只有 ID 是唯一的)
【问题讨论】:
那么您到底想要达到什么目的呢?它应该怎么做,结果会是什么? 试试$sql='...'; $msc=microtime(true); $mysql_query($sql); $msc=microtime(true)-$msc; echo $msc.' seconds'; echo ($msc*1000).' milliseconds';
first 会更快,因为它只从一个表中获取数据
检查***.com/questions/2349270/…
第二个查询使用了一个不存在的表small_table_ratio
?
【参考方案1】:
查询执行时间,并不是唯一需要考虑的参数。
如果任何其他表必须加入 big_table
,则会降低这些连接的性能。
为了可扩展性,我会大胆地拆分表,将数据分开将确保您不会在这里出现瓶颈。
确保将最少使用的数据单独放在一个表中,将最常用的数据放在另一个表中。如果你有一个巨大的text
,把它放在最少使用的表中,也会很好。
【讨论】:
【参考方案2】:没有加入比加入更快。如果你有一个合适的索引(即width
和height
组合的单个索引),那么big_table
上的简单选择会更快。
【讨论】:
看他可能会加入sub_category_id
和category_id
,他只是将瓶颈转移到其他地方,整体性能会下降,还是我错了?以上是关于mysql join:啥更快? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
OUTER APPLY 和 OUTER JOIN 有啥区别,何时使用它们? [关闭]
sql cross join - 有人发现它有啥用处? [关闭]
MySQL 中哪一个更快? COUNT(id) 还是计算结果行? [关闭]