V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
ekeyme
V2EX  ›  MySQL

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

  •  
  •   ekeyme ·
    ekeyme · 2015-08-13 10:01:39 +08:00 · 3049 次点击
    这是一个创建于 3393 天前的主题,其中的信息可能已经有所发展或是发生改变。

    业务:
    有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 链接到一起

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

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

    时间不早先睡了,如果问题没有解决的话,明天上班的时候我会再来回复。
    JamesRuan
        5
    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)

    你需要上面四张表去记录数据间的关系,少一张不行。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1100 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:52 · PVG 03:52 · LAX 11:52 · JFK 14:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.