2011-09-10 36 views
0

我在MySQL的2個表之間Mysql的優化

Table_A { pk_A VARCHAR 150 PRIMARY KEY, random_data } ~ 9500 rows 
Table_B { pk_B VARCHAR 150, more_random_data } ~ 50000 rows 

關係是一對多,pk_A將在山坳pk_B發現多次在表-B。

我的問題是:

  • ,如果我在pk_B啓用索引,PHP/MySQL的CRUD工作正常,但JOIN或涉及兩個表中的命令行任何其它的查詢需要很長的時間

  • 如果我上pk_B禁用索引,PHP/MySQL的CRUD變得laggish,但JOIN或由涉及兩個表命令行任何其它查詢是瞬時

如何能我提高我的數據庫的性能(我可以修改我PK的從varchar到int(11)),但我不知道是否有可用的

感謝

+1

爲什麼你使用varchar作爲主鍵? –

+0

你如何加入桌子?應始終對PK進行索引,並且還應對外鍵列進行索引以加快連接速度。 – bfavaretto

+0

什麼是使用的引擎。 MyISAM和InnoDB有不同的性能考慮因素。 – SingleNegationElimination

回答

2

有幾件事情,以加快您的查詢其他解決方法。正如許多評論所說的那樣;你總是希望保持你的主鍵儘可能小。一個簡短的字符串,比如說VARCHAR(10)不會引起太多的痛苦,但比這個大得多,你可能想要使用代理鍵。通過使自然鍵具有唯一性,可以使其變得或多或少透明,但不能在主鍵中使用。

表-A {pk_A VARCHAR 150 PRIMARY KEY,random_data}〜9500行 表-B {pk_B VARCHAR 150,more_random_data}〜50000行

你的架構應該看起來可能有點像這樣:

CREATE TABLE `Table_A` (
    `id` INTEGER AUTO_INCREMENT PRIMARY KEY, 
    `A_name` VARCHAR(150) UNIQUE NOT NULL, 
    -- other columns 
) ENGINE = InnoDB; 

CREATE TABLE `Table_B` (
    `id` INTEGER AUTO_INCREMENT PRIMARY KEY, 
    `B_name` VARCHAR(150) UNIQUE NOT NULL, 
    `A_id` INTEGER REFERENCES `Table_A`(`id`), 
    -- other columns 
) ENGINE = InnoDB; 
+0

解決方案工作,只是測試查詢時間,它真棒! –