我的表: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 回答
加入没有加入更快 . 如果你有一个正确的索引(即
width
和height
的组合上的单个索引)那么big_table
上的简单选择会更快 .查询执行时间,不是唯一要考虑的参数 .
如果任何其他表必须加入
big_table
,它将会破坏这些连接的性能 .对于可伸缩性,我会挑衅地拆分表,将数据分开将确保您在此处不会出现瓶颈 .
确保将最少使用的数据放在表中以供自己使用,将最常用的数据放在另一个表中 . 如果你有一个巨大的
text
,把它放在最少使用的表中,也会很好 .