MySQL字符集和copy_and_convert_MySQL
bitsCN.com
MySQL字符集和copy_and_convert
关于copy_and_convert
在对MySQL做业务压力测试的时候,我们在perf结果中发现 copy_and_convert 是一个耗费cpu的操作。这个函数的意思,就是在字符集之间做内容转换。
如果源和目标的字符集相同,就可以直接用memcpy,这显然比做字符集转换(按字节或字长拷贝更快,和节省cpu)
当整个系统是CPU瓶颈时,我们希望能够减少这种cpu消耗。
一次查询涉及的拷贝
如果我们执行一个简单的select语句,会涉及到两部分的内容:metadata和data。MySQL的返回包是能够“自解析”的,也就是说不仅有内容,还有描述信息。这些描述信息我们称为metadata。
在将这两部分信息返回给客户端的时候,就涉及到字符串拷贝,如果源字符集和目标字符集不同,就需要作转换。
字符集里面可以定义的部分
1、 表的字符集
比如我们创建如下的表
CREATE TABLE `t` (
`c` int(11) DEFAULT NULL,
`d` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
这就定义了这个表的字符集,要求存入数据按照gbk格式存储。在我们查询的时候,从表中读出的数据,就是我们上文说到的“源字符集”,在这里是gbk.
比如
Insert t values(2012, ‘南方很冷’);
2、连接字符集
在连接的时候我们可以在mysql客户端指定参数 mysql -default-character-set=gbk ,表示我们接收的内容希望是gbk编码,这个就是上文说的“目标字符集”。
一般我们会被建议:连接字符集和表字符集相同。
有的文章说防止乱码—-乱码倒是不会,实际的原因就是在内容拷贝时避免字符集转换计算。
本文要说的“但是”
但是即使这么做,在压力测试(或者你gdb)时,还是会发现会调用到 copy_and_convert。
原因有二:
首先,metadata部分,是固定的使用utf8,这个值可以从show variables like ‘character_set_system’;的结果看到,hardcode,配置无法修改。
其次,虽然我们定义表字符集是gbk, 但是整型字段是是Latin1存储,
#define my_charset_numeric my_charset_latin1,配置无法修改。
因此在我们上面的设置中,一次查询,在传回metadata的时候需要utf8->gbk, 返回结果中c这个字段需要latin1->gbk.
问题和建议
从上面分析知道,这存在的问题就是,无论用户怎么设置,都无法完全避免这种转换。
由于数字类型转成字符串后,使用什么字符集都占用一样的空间。
1) 在代码上最简单的修改可以如下:
将 #define my_charset_numeric my_charset_latin1 改成
#define my_charset_numeric my_charset_utf8_general_ci
这样跟metadata部分相同,然后建表和客户端都是使用utf-8。
2) 更灵活一点是把character_set_system改成可配置,然后整型存储按照用户定义的字符集。
bitsCN.com

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

如何使用Docker進行容器的效能測試和壓力測試,需要具體程式碼範例引言容器虛擬化技術的興起使得應用程式的部署和運行更加靈活和高效,其中最受歡迎的工具之一就是Docker。作為一種輕量級的容器化平台,Docker提供了一種方便的方式來打包、分發和運行應用程序,但是如何對容器的性能進行測試和評估,特別是在高負載情況下的壓力測試,是很多人關心的問題。本文將介紹

Linux是一種開源作業系統,它提供了豐富的網路測試和壓力測試工具,因此在進行網路測試和壓力測試時,Linux是一個非常好的選擇。在本文中,我們將介紹如何使用Linux進行網路測試和壓力測試。一、網路測試網路測試是測試網路效能的過程,通常包括以下測試:頻寬測試在進行網路頻寬測試時,我們需要測量資料在網路中的傳輸速度。其中一個常用的工具是iperf,在Linu

軟體壓力測試是一種基本的品質保證行為,它是每個重要軟體測試工作的一部分。因此壓力測試是十分重要的,那麼要怎麼進行壓力測試呢?以下這篇文章就來跟大家分享一個超實用壓力測試神器--ab工具(apache bench),希望對大家有幫助!

PHP是一種廣泛用於Web開發的腳本語言,它被用於開發許多大型的網站和應用程式。在PHP應用程式開發的過程中,效能最佳化和壓力測試是非常關鍵的,因為這將有助於你確保應用程式在實際運行過程中能夠承受高負載的用戶流量,而不會出現效能問題或系統崩潰。本文主要介紹一些在PHP中使用的常用壓力測試工具。 ApacheBenchApacheBench(ab)是一個基本的

如何使用MTR進行MySQL資料庫壓力測試?概述:MySQLTestRun(MTR)是MySQL官方提供的測試工具,用於測試MySQL資料庫的功能和效能。除了功能測試外,MTR還可以用來進行資料庫壓力測試。本文將介紹如何使用MTR進行MySQL資料庫壓力測試,並提供一些程式碼範例。步驟一:安裝MTR首先,我們需要安裝MTR工具。 MTR是MySQL原始碼中的

MTR:利用MySQL測試框架進行資料庫壓力測試的步驟引言:隨著網路的快速發展,資料庫壓力測試變得越來越重要。資料庫壓力測試旨在模擬實際使用情況下的負載,在高並發的情況下評估資料庫的效能和穩定性。本文將介紹如何利用MySQL測試框架(MySQLTestRunner,簡稱MTR)進行資料庫壓力測試,並提供對應的程式碼範例。一、MTR簡介MySQLTest

如何進行Go語言開發中的效能測試和壓力測試隨著網路應用的不斷發展,效能測試和壓力測試成為了軟體開發過程中不可或缺的一環。在Go語言開發中,我們也需要進行效能測試和壓力測試來確保應用的穩定性和可靠性。本文將介紹如何進行Go語言開發中的效能測試和壓力測試。一、性能測試性能測試是指透過各種手段對系統的負載性能進行評估和測試,主要包括以下幾個方面:確定性能指標在進

如何進行Java開發專案的效能測試與壓力測試隨著網路的不斷發展,Java已成為最常用的開發語言之一。在進行Java開發專案時,效能測試和壓力測試是非常重要的環節。透過效能測試和壓力測試,可以評估系統在特定負載下的效能表現,發現和解決潛在的效能問題,確保系統具備高效能和高可用性。本文將介紹如何進行Java開發專案的效能測試和壓力測試。一、性能測試性能測試
