› 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 · Aug 13, 2015 · 4100 views
    This topic created in 4060 days ago, the information mentioned may be changed or developed.

    业务:
    有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 replies  •  2015-08-13 14:22:16 +08:00
    msg7086
        1
    msg7086  
       Aug 13, 2015   ❤️ 1
    虽然不知道能不能回答你的问题。
    不过很多时候用JOIN本身效率不一定高。
    特别是对于复杂的表连接来说。
    以及简单的请求更容易被cache缓存住。

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

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

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

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

    你需要上面四张表去记录数据间的关系,少一张不行。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1104 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:41 · PVG 07:41 · LAX 16:41 · JFK 19:41
    ♥ Do have faith in what you're doing.