MySQL大表拆分多個表的方式(橫向拆分和縱向拆分)及如何解決跨表查詢效率問題


  大表分表后每個表的結構相同,可以用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 )

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM