2012-11-08 42 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,把它放在最少使用的表格中,那也不錯。