2011-09-10 40 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

解决方案工作,只是测试查询时间,它真棒! –