1. 程式人生 > >MySql中測試GUID 與Int自增主鍵 效能對比 總結適用場景

MySql中測試GUID 與Int自增主鍵 效能對比 總結適用場景


一. 建立以下三個資料表: int 主鍵自增表, guid主鍵表, 關聯以上兩個表的關係表tbl_test_relation

CREATE TABLE `tbl_test_int` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) NULL DEFAULT NULL,
    `comment` VARCHAR(100) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COMMENT='測試int主鍵效能'
COLLATE='utf8_general_ci';


CREATE TABLE `tbl_test_measure` (
    `code` CHAR(36) NOT NULL,
    `deviceID` INT(50) NULL DEFAULT NULL,
    `value` INT(50) NULL DEFAULT NULL,
    `value2` INT(50) NULL DEFAULT NULL,
    PRIMARY KEY (`code`)
)
COMMENT='測試guid作唯一';

CREATE TABLE `tbl_test_relation` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `intvalue` INT(11) NOT NULL DEFAULT '0',
    `codevalue` CHAR(36) NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci';

二. 向資料表插入資料

Insert into tbl_test_int( name,comment) values
    ('TestMY', '哈哈,呵呵');

逐條插入,100萬條資料耗時,30分鐘左右

 Insert into tbl_test_measure(code,deviceID,value,value2) values ( GUID.NewGuid(), 1,2,3);

逐條插入,100萬條資料耗時2845秒


 Insert into tbl_test_relation (intvalue,codevalue)
 ( select a.id as id , b.code as code  from tbl_test_int a , tbl_test_measure b where a.id = b.deviceID   
   and a.id < 100000  and a.id > 40000 )
再插入到關係表中, 使用時間30秒左右


三.分別查詢其中的效能

select a.id, a.codevalue, b.name from tbl_test_relation a , tbl_test_int b where a.intvalue = b.id     limit 10000,80000;
/* Affected rows: 0  已找到記錄: 79,900  警告: 0  持續時間 1 query: 0.110 sec. (+ 0.967 sec. network) */

select a.id, a.codevalue, b.value2,b.value from tbl_test_relation a , tbl_test_measure b where a.codevalue = b.code   limit 10000,80000;
/* Affected rows: 0  已找到記錄: 79,900  警告: 0  持續時間 1 query: 0.234 sec. (+ 1.997 sec. network) */

所用時間相差一倍左右

selecta.id,a.codevalue,b.namefromtbl_test_relationa,tbl_test_intbwherea.intvalue=b.idlimit9000,90000;
/* Affected rows: 0  已找到記錄: 80,900  警告: 0  持續時間 1 query: 0.094 sec. (+ 0.998 sec. network) */
/* 更新查詢歷史時出現錯誤: Failed to set data for '1' */
selecta.id,a.codevalue,b.value2fromtbl_test_relationa,tbl_test_measurebwhere
a.codevalue=b.codelimit9000,90000; /* Affected rows: 0 已找到記錄: 80,900 警告: 0 持續時間 1 query: 0.203 sec. (+ 1.856 sec. network) */ /* 更新查詢歷史時出現錯誤: Failed to set data for '1' */


四.測試總結

1.GUID可以確保資料唯一性,資料安全,資料可移植性強,適用於分散式資料庫中相同表的,不同庫中的儲存。 但其中的Select、Update、Insert 相對於Int,在百萬級資料中來講慢一半左右
2.ID使用Int自增做唯一,可以提高資料操作的效能,但需要注意其唯一的操作

相關推薦

MySql測試GUID Int 效能對比 總結適用場景

一. 建立以下三個資料表: int 主鍵自增表, guid主鍵表, 關聯以上兩個表的關係表tbl_test_relation CREATE TABLE `tbl_test_int` (     `id` INT(11) NOT NULL AUTO_INCREMENT,  

Mysql數據庫表的重新排列

mysql 主鍵 排列Mysql數據庫表的自增主鍵重新排列1,刪除原有主鍵:ALTER TABLE `表名` DROP `id`;2,添加新主鍵字段:ALTER TABLE `表名` ADD `id` MEDIUMINT( 8 ) NOT NULL FIRST;3,設置新主鍵:ALTER TABLE `表名`

Mybatis+Mysql插入數據庫返回id值的三種方法

文章 param mysql int sta source nbsp 通用 映射 一、場景: 插入數據庫的值需要立即得到返回的主鍵id進行下一步程序操作 二、解決方法: 第一種:使用通用mapper的插入方法 Mapper.insertSelective(r

使用UUID和int的區別

知其然,知其所以然。在看到生成UUID的程式碼,後帶給我的百度結合自己的經驗再寫下來的區別 一.UUID做主鍵: 優點: 1.保證資料在表和庫都是獨立的,有利於後續的分庫 2.合併表的時候主鍵不會重複 3.有大量資料的時候主鍵不會像int那樣越界 4.有利於處理分散式儲存的資料表   

Mysql系列課程--第二章 約束

一.約束(保證資料的合理性) 1.not Null 非空約束,不能為null 2.unique 唯一約束 , 不能重複 3.primary key 主鍵約束 ,唯一標識這條資料 4.

【MyBatis】——返回

  mysql自增主鍵,執行insert提交之前自動生成一個自增主鍵。當時一直沒有想為什麼要返回主鍵,也就是返回就返回了吧,總是有用的,確實,返回來有可能會作為下一次查詢的依據,或者下一個插入的外來鍵的憑證,總之,先返回來再說…… 實現思想是醬紫的:通過mysql函式獲

Java程式碼TkMyBatis通用Mapper新增資料時同時獲取ID,適用uuid 做主時獲取 id

一 . MyBatis mapper.xml檔案中在xml    1.   加入 這句 :useGeneratedKeys="true" keyProperty="ID"        keyProperty="資料庫中的主鍵欄位名對應的實體類欄位名" ;【填實體類欄位

【mycat】mycat配合mysql的使用

本文實現一個簡單的demo,展示mycat配合mysql實現分庫時自增主鍵的使用。 前提說明:mycat目前提供了自增主鍵的使用,但是如果對應的mysql節點上的資料表沒有定義auto_increment的話,mycat的自增主鍵也是無效的。 1、在schema.xml中

Mysql獲取剛插入的id的三種方法

我們在寫資料庫程式的時候,經常會需要獲取某個表中的最大序號數, 一般情況下獲取剛插入的資料的id,使用select max(id) from table 是可以的。但在多執行緒情況下,就不行了。 下面介紹三種方法 (1) getGeneratedKeys()方法: 程式

mybatis 設定mysql報錯Incorrect integer value: '' for column 'class_id' at row 1

按道理自增主鍵這樣配置 <insert id="insertAlbum" useGeneratedKeys="true" keyProperty="classId"> insert into attachment_class VA

mysql為什麼不是連續的

  1 自增主鍵不能保證連續遞增 2 MYSQL 5.7之前版本,自增值儲存在記憶體裡,沒有持久化,重啟後會拿當前m

MySQL

MySQL 的主鍵可以是自增的,那麼如果在斷電重啟後新增的值還會延續斷電前的自增值嗎?自增值預設為1,那麼可不可以改變呢?下面就說一下 MySQL 的自增值。 特點 儲存策略 1、如果儲存引擎是 MyISAM,那麼這個自增值是儲存在資料檔案中的; 2、如果是 InnoDB 引擎,

INNODB的一些問題 vs mysql獲得字段下一個值

nod 天發 內存 ima dialog creat class 成對 例子 今天發現 批量插入下,自增主鍵不連續了。。。。。。。 InnoDB AUTO_INCREMENT Lock Modes This section describes

mysql建立的插入,及自動插入當前時間

user 解決方法 int value mysq src blog creat ecc MYSQL裏用這兩個字段,幾乎都是必須的。 以前都是自動建立的,現在手把手建立的時候,就要找資料來搞定了。 參考URL: http://blog.csdn.net/Weicleer

如何獲取數據表的值

兩個 包含 enc gpo into int acl sql emp 一、MySql數據庫   當向數據庫中插入一條數據的時候,默認是拿不到自增主鍵的值的, 需要設置如下兩個屬性才可以拿到主鍵值!   設置userGeneratedKeys屬性值為true:使用自動增長的主

mybatis的執行流程 #{}和${} Mysql返回

ola save select .org 經驗 sel 占位符 upd 執行 n Mybatis配置 全局配置文件SqlMapConfig.xml,配置了Mybatis的運行環境等信息。 Mapper.xml文件即Sql映射文件,文件中配置了操作數據庫的Sql語句。此文件需

JDBC插入表一個數據返回其

Connection connection = JDBCUtils.getConnection(); //獲取一個連結 String sql ="insert into book values (null ,?)"; //資料庫book表中只有一個id自增跟書名欄位 PreparedSta

Mysql UUID做主及字串在插入、查詢,分頁等效能

1.插入方面 UUID做主鍵,其他欄位相同,插入100萬條資料,用了3.5個小時 自增主鍵,其他欄位相同,插入相同的100萬條資料,用了16分鐘 有序增長的字串做主鍵,其他欄位相同,插入相同100萬條資料,用了7分鐘 2.查詢方面 UUID做主鍵,select count() fro

Mybatis的mapper.xml檔案插入資料返回

使用MyBatis往MySQL資料庫中插入一條記錄後,返回該條記錄的自增主鍵值。Mapper檔案應該怎麼寫呢? Mybatis的Mapper的標籤中有一個屬性,我們一起來看看: useGenerateKeys這個屬性,意思就是使用自增。我們需要將這個欄位設定為 true 。 同時,還需

mysql刪除

bsp modify 同時 類型 round mod color tab ext 在MySQL中刪除主鍵需要兩步.(1)如果有auto_increment,先刪除之;(2)刪除主鍵約束 primary key1、alter table t9 modify id int(11