zoukankan      html  css  js  c++  java
  • mysql之优化-分表

    一、表的分割

    1.1 水平分割

    案例 大数据量的用户表
    三张表:qqlogin0、qqlogin1、qqlogin2 ,将用户id%3,按结果放入不同的表当中

    create table qqlogin0( 
        id int unsigned not null primary key,/* 这个id不能设置自增长 */ 
        name varchar(32) not null default '', 
        pwd varchar(32) not null default '' 
    )engine=myisam default charset=utf8; 
    
    create table qqlogin1( 
        id int unsigned not null primary key,/* 这个id不能设置自增长 */ 
        name varchar(32) not null default '', 
        pwd varchar(32) not null default '' 
    )engine=myisam default charset=utf8; 
    
    create table qqlogin2( 
        id int unsigned not null primary key,/* 这个id不能设置自增长 */ 
        name varchar(32) not null default '', 
        pwd varchar(32) not null default '' 
    )engine=myisam default charset=utf8; 
    

    开发 addUser.php ,因为在添加用户时,各个用户id应该确认下,通常我们使用一个辅助表 uuid 表,它可以帮助我们生成一个编号。
    uuid表:

    create table uuid ( 
    		id int unsigned not null auto_increment primary key 
    )engine=myisam default charset=utf8; 
    

    我们在提供检索时,应该根据业务的需求,找到分表的标准,并在检索页面约束用户的检索方式,而且要配合分页。如果有大表检索的需求,也是少数的。

    添加用户时:addUser.php

    <?php 
    $conn = mysql_connect('localhost','root','2012o912@'); 
    if (!$conn) {
    		die('mysql connect error'); 
    } 
    mysql_select_db('temp',$conn); 
    
    $sql = "insert into uuid values (null)"; 
    $res = mysql_query($sql,$conn); 
    
    if ($res) {
    		$uuid = mysql_insert_id(); 
    		$tablename = 'qqlogin'.$uuid%4; 
    		$sql = "insert into $tablename values ($uuid,'abc','abc')"; 
    		$res = mysql_query($sql,$conn); 
    
        if ($res) { 
            echo 'insert success'; 
        }else {
            echo 'insert user error'; 
        }
    }else { 
    		die('insert error'); 
    } 
    ?>
    

    查询用户时,checkUser.php

    <?php 
    $conn = mysql_connect('localhost','root','2012o912@'); 
    if (!$conn) { 
    		die('mysql connect error'); 
    } 
    mysql_select_db('temp',$conn); 
    
    $qqid = intval($_GET['id']); 
    $tablename = 'qqlogin'.$qqid%4; 
    $sql = "select * from $tablename where id='$qqid'"; 
    $res = mysql_query($sql,$conn); 
    
    if ($res) { 
    		$row = mysql_fetch_assoc($res); 
    		print_r($row); 
    }else { 
    		die('no user'); 
    } 
    ?>
    

    1.2 垂直分割

    案例 学生答题系统

    考试结果表
    id stuno questionid answer(text) grade
    1 1 20 [结果。。。] 30

    问题表
    id question
    20 请写一篇散文

    需求: 查处1号学生20题得分情况,但answer字段内容非常大,对查询速度有影响
    解决:把answer(对查询速度影响较大的字段)单独的提出来,放到另外一张表

    回答表 answer
    id answer
    1 结果。。。

    相应的修改考试结果表
    id stuno questionid grade
    1 1 20 30

    总结:把某个表的某些字段,这些字段,在查询时,并不实时关心,但数据量很大, 我们建议大家可以 把这些字段单独的放到另外一张表,从而提高效率。但是不要忘记关联关系。表的字段定义原则是保小不保大,尽量节省空间

    二、读写分离

    如果数据库压力很大,一台机器支撑不了,可以用MySQL复制实现多台机器同步,将数据库压力分散

  • 相关阅读:
    ssh session 共享
    python 快速开启http服务
    GCC 默认头文件搜索路径
    GCC 部分单元测试编译失败
    随机森林与GBDT
    DecisionTree
    SVM
    KDDCUP CTR预测比赛总结
    剑指offer-java
    搜狗搜索日志传输与分析
  • 原文地址:https://www.cnblogs.com/daozhangblog/p/12446395.html
Copyright © 2011-2022 走看看