首页 文章

mysql join:什么更快? [关闭]

提问于
浏览
0

我的表:big_table

+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | mediumint(7) | NO   | PRI | NULL    | auto_increment |
| title           | varchar(255) | NO   |     | NULL    |                |
| category_id     | tinyint(2)   | NO   |     | NULL    |                |
| sub_category_id | tinyint(2)   | NO   |     | NULL    |                |
| width           | smallint(5)  | NO   |     | NULL    |                |
| height          | smallint(5)  | NO   |     | NULL    |                |
| ratio_width     | smallint(5)  | NO   |     | NULL    |                |
| ratio_height    | smallint(5)  | NO   |     | NULL    |                |
| size            | int(8)       | NO   |     | NULL    |                |
| mime            | tinyint(2)   | NO   |     | NULL    |                |
| views           | mediumint(7) | NO   | MUL | NULL    |                |
| time            | int(10)      | NO   |     | NULL    |                |
| file            | varchar(255) | NO   |     | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+

小 table

+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| id     | mediumint(7) | NO   | PRI | NULL    |       |
| width  | smallint(5)  | NO   | MUL | NULL    |       |
| height | smallint(5)  | NO   | MUL | NULL    |       |
+--------+--------------+------+-----+---------+-------+

什么更快(例子):

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';

或者从同一张 table 加入?

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是唯一的)

2 回答

  • 1

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

  • 0

    查询执行时间,不是唯一要考虑的参数 .
    如果任何其他表必须加入 big_table ,它将会破坏这些连接的性能 .

    对于可伸缩性,我会挑衅地拆分表,将数据分开将确保您在此处不会出现瓶颈 .

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

相关问题