mysql分表技術詳解 mysql分表詳解

2021-10-17 19:46:37 字數 2656 閱讀 2158

本人混跡qq群2年多了,經常聽到有人說「資料表太大了,需要分表」,「***x了,要分表」的言論,那麼,到底為什麼要分表?

難道資料量大就要分表?

mysql資料量對索引的影響

本人mysql版本為5.7

新增資料測試

為了測試mysql索引查詢是否和資料量有關,本人做了以下的測試準備:

新建4個表article1,article2,article3,article4,article5 每個表分別插入20萬,50萬,100萬,200萬,1500萬的資料,資料都是隨機生成create table test.article1(

id          int auto_increment comment 'id'

primary key,

user_id     int          not null comment '使用者id',

title       varchar(64)  not null comment '標題',

add_time    datetime     null comment '新增時間',

update_time int          null comment '更新時間',

description varchar(255) null comment '簡介',

status      tinyint(1)   null comment '狀態 1正常 0隱藏'

charset = utf8;

create index article_title_index

on test.article1 (title);

生成資料指令碼,使用easyswoole,多協程插入:<?php

include "./vendor/autoload.php";

\easyswoole\easyswoole\core::getinstance()->initialize();

for ($i = 0; $i <= 2000; $i++) , -1);

function getchar($num)  // $num為生成漢字的數量

$b = '';

for ($i = 0; $i 

// 使用chr()函式拼接雙位元組漢字,前乙個chr()為高位位元組,後乙個為低位位元組

$a = chr(mt_rand(0xb0, 0xd0)) . chr(mt_rand(0xa1, 0xf0));

// 轉碼

$b .= iconv('gb2312', 'utf-8', $a);

return $b;

生成的資料如圖:

資料庫總條數預覽:select (select count(1) from article1) as "1" , (select count(1) from article2) as "2", (select count(1) from article3) as "3", (select count(1) from article4) as "4", (select count(1) from article5) as "5";

查詢時間測試

查詢指令碼<?php

* created by phpstorm.

* user: tioncico

* date: 19-5-11

* time: 下午7:20

include "./vendor/autoload.php";

\easyswoole\easyswoole\core::getinstance()->initialize();

go(function () 應該儲存到表";

//tioncico應該儲存到user3表

不建議使用id分表,因為一般情況下,我們是使用賬號,或者其他唯一標識 來進行區分某個人的,如果你表設計像qq號一樣,那完全可以將id命名為其他的字段,用於區分,自增id同樣需要

取模分表法會使資料盡量的均衡分布,壓力均衡,非常適合於需要通過特定標識字段查詢資料的表(會員表)

冷熱資料分表

冷熱資料大多數體現在跟時間有關的 日誌表,訂單表上面

在冷熱資料分表時,我們應該遵循以下幾種分表規則

1:資料冷熱分表,需要注意冷熱資料的界限

例如,**訂單表,每天增加100萬的訂單,一年就會增加到3.6億的訂單數,而大多數情況下,使用者只會查詢近1-3個月的資料,我們可以

通過訂單時間進行分表,只需要按照月份進行分表即可

2:通過取模分表,需要注意取模字段,

垂直分表

區分一條資料的不同字段,叫做垂直分表

垂直分表其實我們在設計資料庫時,可能已經是用到了的,比如會員金額表,關聯會員表的userid,這個時候,其實就可以叫做是垂直分表

把會員金額的字段分到了其他的表中(會員金額表)

垂直分表較為簡單,有以下幾種分法:

1:字段意義和表其他字段意義不同,可以嘗試分表

2:字段占用空間太大,不常用或只在特定情況使用,可以嘗試分表

3:欄位與其他字段更新時間不同,可以嘗試分表

以上是本人對分表的一些理解,如果有錯誤或者補充,歡迎各位大神指點一二,本人感激不盡

mysql可以分享的技術 技術分享 MySQL

1 查詢語句是如何執行的?1 連線 1 建立連線 2 驗證許可權,修改了許可權,建立新的連線才會生效。3 sql執行的臨時記憶體 2 查詢快取 1 先查詢快取,更新操作會導致所有快取失效。2 mysql 8.0功能去掉 3 分析 詞法解析,語法解析 4 優化 1 決定使用哪個索引,比方說根據統計資訊...

mysql分表和表分割槽詳解

為什麼要分表和分割槽?日常開發中我們經常會遇到大表的情況,所謂的大表是指儲存了百萬級乃至千萬級條記錄的表。這樣的表過於龐大,導致資料庫在查詢和插入的時候耗時太長,效能低下,如果涉及聯合查詢的情況,效能會更加糟糕。分表和表分割槽的目的就是減少資料庫的負擔,提高資料庫的效率,通常點來講就是提高表的增刪改...

mysql分表和表分割槽詳解

為什麼要分表和分割槽?日常開發中我們經常會遇到大表的情況,所謂的大表是指儲存了百萬級乃至千萬級條記錄的表。這樣的表過於龐大,導致資料庫在查詢和插入的時候耗時太長,效能低下,如果涉及聯合查詢的情況,效能會更加糟糕。分表和表分割槽的目的就是減少資料庫的負擔,提高資料庫的效率,通常點來講就是提高表的增刪改...