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