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 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











컨테이너의 성능 테스트 및 스트레스 테스트를 위해 Docker를 사용하려면 특정 코드 예제가 필요합니다. 소개 컨테이너 가상화 기술의 등장으로 애플리케이션의 배포 및 운영이 더욱 유연하고 효율적으로 이루어졌으며 가장 널리 사용되는 도구 중 하나는 Docker입니다. 경량 컨테이너화 플랫폼인 Docker는 애플리케이션을 패키징하고 배포하고 실행하는 편리한 방법을 제공하지만, 컨테이너의 성능, 특히 고부하 조건에서의 스트레스 테스트를 어떻게 테스트하고 평가하는지에 대해서는 많은 사람들이 우려하는 질문입니다. 이 글에서 소개할

Linux는 풍부한 네트워크 테스트 및 스트레스 테스트 도구를 제공하는 오픈 소스 운영 체제이므로 네트워크 테스트 및 스트레스 테스트를 수행할 때 Linux는 매우 좋은 선택입니다. 이 기사에서는 네트워크 테스트 및 스트레스 테스트에 Linux를 사용하는 방법을 다룹니다. 1. 네트워크 테스트 네트워크 테스트는 네트워크 성능을 테스트하는 프로세스이며 일반적으로 다음 테스트를 포함합니다. 대역폭 테스트 네트워크 대역폭 테스트를 수행할 때 네트워크의 데이터 전송 속도를 측정해야 합니다. 일반적으로 사용되는 도구 중 하나는 Linux에서 사용할 수 있는 iperf입니다.

소프트웨어 스트레스 테스트는 모든 중요한 소프트웨어 테스트 노력의 일부인 기본적인 품질 보증 활동입니다. 따라서 스트레스 테스트는 매우 중요합니다. 그렇다면 스트레스 테스트를 어떻게 수행합니까? 이 기사에서는 매우 실용적인 스트레스 테스트 도구인 ab 도구(아파치 벤치)를 공유하겠습니다. 이 도구가 도움이 되기를 바랍니다.

PHP는 웹 개발에 널리 사용되는 스크립팅 언어로, 많은 대규모 웹사이트와 애플리케이션을 개발하는 데 사용됩니다. 성능 최적화 및 스트레스 테스트는 PHP 애플리케이션 개발 중에 매우 중요합니다. 이는 애플리케이션이 성능 문제나 시스템 문제 없이 실제 작업 중에 높은 사용자 트래픽 부하를 견딜 수 있는지 확인하는 데 도움이 됩니다. 이 기사에서는 주로 PHP에서 사용되는 몇 가지 일반적인 스트레스 테스트 도구를 소개합니다. ApacheBenchApacheBench(ab)는 기본입니다.

MySQL 데이터베이스 스트레스 테스트에 MTR을 사용하는 방법은 무엇입니까? 개요: MTR(MySQLTestRun)은 MySQL 데이터베이스의 기능과 성능을 테스트하기 위해 MySQL에서 공식적으로 제공하는 테스트 도구입니다. 기능 테스트 외에도 MTR은 데이터베이스 스트레스 테스트에도 사용할 수 있습니다. 이 기사에서는 MySQL 데이터베이스 스트레스 테스트에 MTR을 사용하는 방법을 소개하고 몇 가지 코드 예제를 제공합니다. 1단계: MTR 설치 먼저 MTR 도구를 설치해야 합니다. MTR은 MySQL 소스 코드에 있습니다.

MTR: MySQL 테스트 프레임워크를 사용한 데이터베이스 스트레스 테스트 단계 소개: 인터넷의 급속한 발전으로 인해 데이터베이스 스트레스 테스트가 점점 더 중요해지고 있습니다. 데이터베이스 스트레스 테스트는 실제 사용 시 부하를 시뮬레이션하고 높은 동시성에서 데이터베이스의 성능과 안정성을 평가하도록 설계되었습니다. 이 기사에서는 MySQL 테스트 프레임워크(MySQLTestRunner, 줄여서 MTR)를 사용하여 데이터베이스 스트레스 테스트를 수행하는 방법을 소개하고 해당 코드 예제를 제공합니다. 1. MTR MySQLTest 소개

Go 언어 개발에서 성능 테스트 및 스트레스 테스트를 수행하는 방법 인터넷 애플리케이션의 지속적인 개발로 인해 성능 테스트 및 스트레스 테스트는 소프트웨어 개발 프로세스에서 없어서는 안될 부분이 되었습니다. Go 언어 개발에서는 애플리케이션의 안정성과 신뢰성을 보장하기 위해 성능 테스트와 스트레스 테스트도 수행해야 합니다. 이 글에서는 Go 언어 개발에서 성능 테스트와 스트레스 테스트를 수행하는 방법을 소개합니다. 1. 성능 테스트 성능 테스트는 다양한 수단을 통해 시스템의 로드 성능을 평가 및 테스트하는 것을 의미하며 주로 다음 측면을 포함합니다. 성능 지표의 진행 상황 결정

Java 개발 프로젝트에서 성능 테스트 및 스트레스 테스트를 수행하는 방법 인터넷의 지속적인 개발로 Java는 가장 일반적으로 사용되는 개발 언어 중 하나가 되었습니다. Java 개발 프로젝트를 수행할 때 성능 테스트와 스트레스 테스트는 매우 중요한 링크입니다. 성능 테스트 및 스트레스 테스트를 통해 특정 부하에서 시스템 성능을 평가하고 잠재적인 성능 문제를 발견 및 해결하며 시스템의 성능과 고가용성을 보장할 수 있습니다. 이 기사에서는 Java 개발 프로젝트의 성능 테스트 및 스트레스 테스트를 수행하는 방법을 소개합니다. 1. 성능 테스트 성능 테스트
