TiDB入門(三):簡單測試
上一次我們搭建了TiDB 環境,那麼現在我想用跑跑資料,看看 TiDB 和 傳統 MySQL 相比到底優越在哪裡。
資料庫配置
TiDB 叢集
由虛擬機器搭建叢集,共享 CPU 和記憶體
- CPU:Xeon(R) X5650 * 2 (兩個物理 CPU,邏輯 24 核)
- 記憶體:64G DDR3 1333MHz
- 主硬碟: 5.45 TB raid5 (DELL 伺服器磁碟 7200 轉)
- 固態:120GB * 3 (非伺服器 SSD)
MySQL 單例
配置暫時缺失…
資料準備
下載測試資料
所有資料均來自於 Stack Exchange Data Dump 。
當然下載的資料都是 xml 格式,方便大家使用,已經轉化成 MySQL 能使用的 sql 檔案了。
下載:
- 小資料: math_stackchange
- 大資料: stackoverflow
插入資料
把對應的資料庫建立好,匯入資料即可。由於資料大概有 15G 左右,匯入時間過長,可以看部電影耐性等待。
注: 匯入資料到 TiDB 叢集明顯比傳統 MySQL 資料庫慢,這裡我暫時還沒有找到原因。
$ mysql -uroot -h192.168.13.157 -P 4000 math_stackexchange < math_stackexchange.sql $ mysql -uroot -h192.168.13.157 -P 4000 stackoverflow < stackoverflow.sql
測試
測試表資訊
- comments 表
CREATE TABLE `comments` ( `Id` BIGINT(20) NOT NULL AUTO_INCREMENT, `PostId` BIGINT(20) NULL DEFAULT NULL, `Score` INT(11) NULL DEFAULT NULL, `Text` TEXT NULL, `CreationDate` DATETIME NULL DEFAULT NULL, `UserId` BIGINT(20) NULL DEFAULT NULL, `UserDisplayName` VARCHAR(100) NULL, PRIMARY KEY (`Id`), INDEX `CreationDate` (`CreationDate`) ) COLLATE='utf8mb4_bin' ENGINE=InnoDB ;
- users 表
CREATE TABLE `users` ( `Id` BIGINT(20) NOT NULL AUTO_INCREMENT, `Reputation` INT(11) NULL DEFAULT NULL, `CreationDate` DATETIME NULL DEFAULT NULL, `DisplayName` VARCHAR(100) NULL, `LastAccessDate` DATETIME NULL DEFAULT NULL, `WebsiteUrl` VARCHAR(255) NULL, `Location` VARCHAR(100) NULL, `AboutMe` TEXT NULL, `Views` INT(11) NULL DEFAULT NULL, `UpVotes` INT(11) NULL DEFAULT NULL, `DownVotes` INT(11) NULL DEFAULT NULL, `AccountId` BIGINT(20) NULL DEFAULT NULL, `ProfileImageUrl` VARCHAR(255) NULL, PRIMARY KEY (`Id`), INDEX `CreationDate` (`CreationDate`) ) COLLATE='utf8mb4_bin' ENGINE=InnoDB ;
資料庫 | 表名 | 數量 | 量級 |
---|---|---|---|
math_stackexchange | users | 497023 | 十萬級別 |
math_stackexchange | comments | 4463392 | 百萬級別 |
stackoverflow | users | 9737247 | 接近千萬級別 |
stackoverflow | comments | 60915000 | 5 千萬級別 |
單表查詢
單表 Count
$ SELECT COUNT(0) FROM [表名]
MySQL | TiDB | |
---|---|---|
math_stackexchange.users | 0.234 sec | 0.359 sec |
math_stackexchange.comments | 1.031 sec | 0.625 sec |
stackoverflow.users | 3.719 sec | 0.953 sec |
stackoverflow.comments | 15.359 sec | 4.922 sec |
帶索引
$ select count(0) from [表名] where CreationDate > '2017-01-01'
MySQL | TiDB | |
---|---|---|
math_stackexchange.users | 0.063 sec | 0.219 sec |
math_stackexchange.comments | 0.422 sec | 0.813 sec |
stackoverflow.users | 0.922 sec | 1.312 sec |
stackoverflow.comments | 2.891 sec | 1.437 sec |
無索引
$ select count(0) from math_stackexchange.users where views > 10 $ select count(0) from math_stackexchange.comments where score > 3 $ select count(0) from stackoverflow.users where views > 10 $ select count(0) from stackoverflow.comments where score > 3
MySQL | TiDB | |
---|---|---|
math_stackexchange.users | 0.203 sec | 0.484 sec |
math_stackexchange.comments | 2.219 sec | 1.297 sec |
stackoverflow.users | 4.312 sec | 2.297 sec |
stackoverflow.comments | 61.42 sec | 11.313 sec |
連表查詢
$ select count(0) from math_stackexchange.comments as a join math_stackexchange.users as b on a.UserId = b.Id where a.CreationDate > '2017-01-01' andb.views > 10 $ select count(0) from stackoverflow.comments as a join stackoverflow.users as b on a.UserId = b.Id where a.CreationDate > '2017-01-01' andb.views > 10
MySQL | TiDB | |
---|---|---|
math_stackexchange | 5.297 sec | 4.468 sec |
stackoverflow | 180.55 sec | 27.515 sec |
小結
- 由於硬體所限,無法發揮 TiDB 比較好的效能。
- 在表資料量比較小的時候 MySQL 的速度其實是好於 TiDB 的。
- 因為 TiDB 元件之間需要網路傳輸 (這也是 TiDB 生產環境需要萬兆網絡卡的原因)
- 對於小表資料 MySQL 會儲存在快取中
- TiDB 在大資料量上基本是是好於 MySQL (官方推薦表資料在 5000w 以上)