实测 Mysql UUID 性能(转)
網上普遍認為Mysql? 使用 UUID 主鍵性能低下,甚至建議用 自增ID 作為主鍵并用 UUID作唯一索引的方案。但沒有提供具體的數據證明使用 UUID 作為主鍵時性能究竟低下到何種程度。為此我專門做了測試。
測試環境:WindowsXP ,內存 4G , CPU : Duo?T6570 , mysql : 5.1.36
測試準備:
1、 建表
我建了3 個表來做性能比對
表一:uuidtest_inno
Sql代碼 ?- CREATE?TABLE?`uuidtest_inno`?(??
- `id`?char(36)?CHARACTER?SET?utf8?NOT?NULL?DEFAULT?'',??
- PRIMARY?KEY?(`id`)??
- )?ENGINE=InnoDB?DEFAULT?CHARSET=latin1??
?
表二:uuidtest_myisam
Sql代碼 ?- CREATE?TABLE?`uuidtest_myisam`?(??
- ??`id`?char(36)?CHARACTER?SET?utf8?NOT?NULL?DEFAULT?'',??
- ??PRIMARY?KEY?(`id`)??
- )?ENGINE=MyISAM?DEFAULT?CHARSET=latin1??
?
?
表三:uuidtest_int
Sql代碼 ?- ????CREATE?TABLE?`uuidtest_int`?(??
- ??????`id`?int(11)?NOT?NULL?AUTO_INCREMENT,??
- ??????`test`?varchar(255)?CHARACTER?SET?latin1?DEFAULT?NULL,??
- ??????PRIMARY?KEY?(`id`)??
- )?ENGINE=MyISAM?DEFAULT?CHARSET=utf8??
?
可以看到,表一使用UUID 主鍵,引擎為 InnodB ;表二使用 UUID 主鍵,引擎為 MyISAM ;表三使用 自增ID ,引擎為MyISAM ;
?
1、 編寫存儲過程
編寫存儲過程分別插入100000 條記錄:
?
p_uuid_inno
Sql代碼 ?- BEGIN??
- ????set?@i?=?0;??
- ????while?@i?<?100000?do??
- ????????????insert?into?uuidtest_inno?value(uuid());??
- ????????set?@i?=?@i+1;??
- ????end?while?;??
- END??
?
p_uuid_myisam
Sql代碼 ?- BEGIN??
- ????set?@i?=?0;??
- ????while?@i?<?100000?do??
- ????????????insert?into?uuidtest_myisam?value(uuid());??
- ????????set?@i?=?@i+1;??
- ????end?while?;??
- END??
?
?
p_uuid_int
Sql代碼 ?- BEGIN??
- ????set?@i?=?0;??
- ????while?@i?<?100000?do??
- ????????????insert?into?uuidtest_int(test)?value("test");??
- ????????set?@i?=?@i+1;??
- ????end?while?;??
- END??
?
1、 運行
[SQL]?call?p_uuid_int;
影響的數據欄:?0
時間:?12.922ms
?
call?p_uuid_myisam;
影響的數據欄:?0
時間:?15.078ms
?
call?p_uuid_inno;
影響的數據欄:?0
時間:?4460.297ms
?
結論:當數據表的引擎為MyISAM 時,自增 ID 無疑是效率最高的, UUID 效率略低,但不會低到無法接受。一旦數據引擎為 InnodB 時,效率下降非常嚴重,已經達到令人發指的地步。由于 InnodB 主鍵采用 聚集索引 ,會對插入的記錄進行物理排序,而 UUID本身基本上是無序的,所以造成了巨大的 I/O 開銷。所以如果使用 innodB? 千萬不要使用 UUID 。
?
?
謝謝?
2 樓 gaizai 2012-02-29?? 測試不嚴謹,你沒有測試innodb下的int,一樣的速度。?
1 樓 laoxing521 2011-04-19?? 樓主有心如果斷定是因為innodb是因為物理排序而造成性能損失, 那么是什么做主鍵就沒關系了
只要是無序的數字, 字符串做主鍵,都要有這樣的結果
人們講用uuid會影響性能, 是說UUID的生成效率不高. 而非插入效率,? 生成了之后,UUID就是一普通字符串了.
?
轉載于:https://www.cnblogs.com/tonykan/archive/2012/11/26/2788422.html
總結
以上是生活随笔為你收集整理的实测 Mysql UUID 性能(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钟馗引福图是谁画的啊?
- 下一篇: 一个apk多个ICON执行入口