【问题标题】: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 会更快,因为它只从一个表中获取数据
  • 第二个查询使用了一个不存在的表small_table_ratio?

标签: mysql performance join


【解决方案1】:

查询执行时间,并不是唯一需要考虑的参数。
如果任何其他表必须加入 big_table,则会降低这些连接的性能。

为了可扩展性,我会大胆地拆分表,将数据分开将确保您不会在这里出现瓶颈。

确保将最少使用的数据单独放在一个表中,将最常用的数据放在另一个表中。如果你有一个巨大的text,把它放在最少使用的表中,也会很好。

【讨论】:

    【解决方案2】:

    没有加入比加入更快。如果你有一个合适的索引(即widthheight 组合的单个索引),那么big_table 上的简单选择会更快。

    【讨论】:

    • 看他可能会加入sub_category_idcategory_id,他只是将瓶颈转移到其他地方,整体性能会下降,还是我错了?
    猜你喜欢
    • 2011-09-18
    • 2017-01-18
    • 2016-11-20
    • 2021-04-02
    • 1970-01-01
    • 2012-11-09
    • 2014-10-01
    • 1970-01-01
    • 2014-12-15
    相关资源
    最近更新 更多