我的MySQL数据库中有2个表。
我们称第一main
,第二final
。
TABLE `main` has the structure | TABLE `final` has the structure
|
`id` --> PRIMARY KEY (Auto Increment) | `id` --> PRIMARY KEY (Auto Increment)
| `id_main` --> ?? (Need help here)
|
id | name | info | id | id_main | name | info(changed)
--------------------- | ---------------------------------------
1 | Peter | 5,9 | 1 | 2 | Butters | 0.3,34
2 | Butters | 3,3 | 2 | 4 | Stewie | 1.2,4.4
3 | Stan | 2,96 | 3 | 1 | Peter | 5.7,0.9
4 | Stewie | 1,84 | 4 | 3 | Stan | 4.8,0.74
分析main
中的数据后,结果将放入final
中。
如您所见,final
有一个额外的列(id_main
)指向main
。id
实际上这两个表各有1亿多行,执行SQL查询时出现了我的问题。
如何配置final
,尤其是{id
和id_main
,以使从main
到final
的查询最快。
我可以取消final.id
(PRIMARY KEY,自动递增)并保留吗
final.id_main
(作为唯一索引?)
OR
我应该保留id
作为主键(AI)和final.id_main
作为唯一索引吗?
我会像这样拨打电话
int id_From_Main= 10000;
SELECT `id_main` FROM `final` WHERE `id`='"+id_From_Main+"'
答案 0 :(得分:0)
如果这些表之间存在1:1的关系,我看不出它们为什么需要两个独立的自动递增主键的原因。
我将删除final.id
列,并将final.id_main
作为非自动递增的主键,并将其作为main.id
列的外键。
通常,您也可以有一个完全没有主键的表。这取决于您是否希望选择特定的单个行。
我不理解您的查询SELECT id_main FROM final WHERE id = '"+id_From_Main+"'
-您正尝试通过main中的ID选择main中ID的值。目的是什么,为什么要尝试获得已经拥有的价值?
无论如何,您提供的信息不足以提供合格的答案。您必须根据要执行的查询来优化数据结构。
确保在WHERE
子句中使用的列上有索引。如果按final.id_main
选择,则在该列上有一个索引。如果按final.id_main
和final.name
进行选择,则两列均应有一个复合索引,等等。
两个表中是否确实需要name
列?除非进行一些性能优化(以避免连接),否则这是一个不好的数据库设计。
因此,您应该:
final.id
,final.name
)EXPLAIN
获取执行信息(也可以使用Explain analyzer帮助您解释结果)答案 1 :(得分:-1)
在mysql中,您必须将id定义为PK,因为它是auto_increment。将id_main定义为UNIQUE。