qq_41265012 2022-03-06 19:28 采纳率: 70%
浏览 226
已结题

mysql 拆分表,怎么查询?

mysql 内容表数据超过3千万行太大了,我按1千万一个表拆成3个表,那么每次查询的时候,都要同时查询3个表吗?如果以后有2亿数据,岂不是每次要查询20个表?怎么解决数据量大表拆分后的查询?

  • 写回答

12条回答 默认 最新

  • 智慧方案文库 2022-03-06 20:02
    关注
    获得0.35元问题酬金

    大表分表后每个表的结构相同,可以用sql的union。比如a,b表结构相同可以通过union来联接
    select * from a
    union all
    select * from b
    where ...
    一、Union和Union All到底有什么区别
      Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;

      Union All:对两个结果集进行并集操作,包括重复行,不进行排序;

      比如一家公司在中美均有雇员,我们使用Union这个命令想查出中美所有雇员,是不行的。假如我们有两个名字相同的雇员,他们当中就只会有一个人被列出来了。UNION 命令只会选取不同的值。而Union All则可以查出全部的值。

      详细了解:https://www.w3school.com.cn/sql/sql_union.asp

    二、大表拆分后的查询效率问题
      假如一个超级大的用户表按照数据拆分成10个表后,某个用户登录的时候是不是要从10个表里面去查询这个用户的用户名和密码是否正确。这样就存在效率问题。

      一种方案就是拆表的时候,按照一定规则来拆表,查询的时候按照这个规则来查,通过规则就能知道到底该去哪个表查,如果胡乱拆表,那一个表和10个表有什么区别。

    三、大表拆分
      表的拆分分为横向拆分(记录的拆分)和纵向拆分(字段的拆分)。拆分表的目的:提高查询速度。

    (1)横向拆分 - 记录的拆分

      我们从一个案例去解释,情景是这样的:某某博客,有50W的博客量,有2w的用户,发现随着用户和博客数的增加,查询速度日渐下降,现在要对博客表blog与用户表user进行优化。

      表结构如下:
    create table blog(
    bid
    title
    content
    pubtime
    uid
    ) 50万
    create table user(
    uid
    username
    password
    nick
    ......
    ) 2万
    首先我们要决定根据哪个字段对记录进行拆分,查询决定了拆分,在这里我们根据uid字段对两个表进行拆分是比较合理的。

    博客表根据uid去拆分:
    1-5000------blog_1
    5001-10000-----blog_2
    10001-15000----blog_3
    15001-20000----blog_4
    人员表根据uid 等分:
    1-5000------user_1
    5001-10000-----user_2
    10001-15000----user_3
    15001-20000----user_4

      比如查询某人的博客:

    // 根据uid确认表名:
    $num=ceil(12345/5000);
    select uid,bid,title,pubtime from blog_$num where uid=12345;
    (2)纵向拆分:字段的拆分 - 把活跃字段(常用)、惰性字段(不常用)分开。

      案例:比如人员表,活跃字段像用户名、密码、昵称等,惰性字段像手机号、邮箱、性别等不经常使用和修改的字段。

      一张完整的用户表可以拆分为两张表,如下:

    create table user(
    uid int key auto_increment,
    username char(20),
    password char(32) not null,
    nick char(10)
    );
    create table user_ext(
    uid
    regtime
    name
    email
    qq
    phone
    sex
    )

    评论

报告相同问题?

问题事件

  • 系统已结题 3月14日
  • 修改了问题 3月6日
  • 创建了问题 3月6日

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号