mysql 分表问题,哪一种会更有性能呢?

2015-08-13 10:01:39 +08:00
 ekeyme

业务:
有1大批基因,按2中方式分类:1类是按 功能,另1类是按 代谢途径。
此外,1个基因可能同属于多个功能、或者多个代谢途径。
平时主要是通过 功能、或代谢途径 获得相应类别下的所有基因,或者查询某个基因给出相应的代谢途径或功能。

想法:
我想到了2种分表方式,但不知道哪一种更好,所以想请大家给我点建议,甚至提出更好的分表方式更欢迎。我还有想知道一般数据库的性能测试一般都怎么做的呢?有一些经验或者书可以推荐的话那就更好了,先事先感谢大家的关注。

---方式1
1. 表1 代谢途径:category_id(index,自增) / name 类名
2. 表2 基因功能:category_id(index,自增) / name 类名
3. 表达 基因:gene_id(index,用唯一的通用的ID名,不一定自增) / category_id(对应上面的功能、或代谢途径) / type(1代表对应代谢途径,2代表对应基因功能的id)

此方式在此方式搜寻或者join的时候,仅能 用 ON 代谢途径/基因功能.category_id = 基因.category_id 衔接后,加一个where 基因.type=1/2。

---方式2
1. 表1 代谢途径:
/ category_id(index,自增)
/ name 类名
2. 表2 基因功能:
/category_id(index,自增)
/ name 类名
3. 表达 基因:
/gene_id(index,用唯一的通用的ID名,不一定自增)
/category_id(以num-category_id形式储存,如{1-category_id};或是{2-category_id};category_id对应上面的功能、或代谢途径中的id;前面的1代表对应代谢途径,2代表对应基因功能的id)

此方式搜寻或者join的时候可以 用 ON 代谢途径/基因功能.concat('1或者2', '-', category_id) = 基因.category_id 链接到一起

2900 次点击
所在节点    MySQL
5 条回复
msg7086
2015-08-13 11:32:32 +08:00
虽然不知道能不能回答你的问题。
不过很多时候用JOIN本身效率不一定高。
特别是对于复杂的表连接来说。
以及简单的请求更容易被cache缓存住。

另外建议说一下数据的规模?
ekeyme
2015-08-13 12:28:00 +08:00
@msg7086 嗯。首先非常感谢。如果不用join的话,那就是先select出一部分条件在select么?另外,我在数据库上很多东西还是不熟悉,你问的数据规模是怎么表示呢? 我这里gene那个数据库中有7万条记录,一个库中所有表的数据加起来 达到1G上。
ekeyme
2015-08-13 12:28:53 +08:00
@msg7086 更正:这里gene那个数据库,应该是那张表
msg7086
2015-08-13 13:27:16 +08:00
主要是我没看明白你表到底是怎么存放数据的。
你可以考虑先把要存的数据写出来,给点例子,这样比较方便看。
1G的数据量很小,大多数时候稍微优化一下就能跑得飞快了。
关于性能调优,如果你有生产环境的话,当然是放到生产环境来测试最方便。
如果没有的话,一般用explain去看查询计划,看看是不是都用了索引了。
另外,由于通常短小的查询更容易被cache,所以做两次或者三次select或许会更快。
当然具体还是要看实际的业务情况来定。

时间不早先睡了,如果问题没有解决的话,明天上班的时候我会再来回复。
JamesRuan
2015-08-13 14:22:16 +08:00
都不是正确的方法。你应该去学学数据库范式。

最先应该弄清楚的是数据之间的关系:基因和功能,基因和代谢途径是互相有交叉的多对多的关系:

同一个基因可以有多个功能:
gene_id(one) -> function_id(many)
同一个基因可以参与多个代谢途径:
gene_id(one) -> pathway_id(many)
同一个功能有多个基因:
function_id(one) -> gene_id(many)
同一个代谢途径有多个基因:
pathway_id(one) -> gene_id(many)

你需要上面四张表去记录数据间的关系,少一张不行。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/212861

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX