2012-11-08 41 views
0

我的表:BIG_TABLEmysql连接:什么更快?

+-----------------+--------------+------+-----+---------+----------------+ 
| 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 |    | 
+-----------------+--------------+------+-----+---------+----------------+ 

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

或加入的FR呃同一张桌子?

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

+0

那你试图完成什么?它应该做什么,结果是什么? –

+0

尝试'$ sql ='...'; $ msc = microtime(true); $ mysql_query($ sql); $ msc = microtime(true) - $ msc; echo $ msc。'秒; echo($ msc * 1000)。'毫秒; ' –

+0

首先会更快,因为它只从一个表获取数据 –

回答

1

没有连接加快了连接速度。如果您有合适的索引(即widthheight的组合中的单个索引),那么big_table上的简单选择将会更快。

+0

鉴于他可能加入'sub_category_id'和'category_id',他只会将瓶颈移到其他地方,整体性能会下降,或者我错了吗? – Kao

0

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

对于可扩展性,我会挑衅地拆分表,将数据分开将确保您,这里不会出现瓶颈。

请确保您将最少使用的数据放在一张表中,另一份中最常用的数据。如果你有一个巨大的text,把它放在最少使用的表格中,那也不错。