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

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser Docker pour les tests de performances et les tests de stress des conteneurs nécessite des exemples de code spécifiques Introduction L'essor de la technologie de virtualisation des conteneurs a rendu le déploiement et le fonctionnement des applications plus flexibles et efficaces, et l'un des outils les plus populaires est Docker. En tant que plate-forme de conteneurisation légère, Docker offre un moyen pratique d'empaqueter, de distribuer et d'exécuter des applications, mais comment tester et évaluer les performances des conteneurs, en particulier les tests de contrainte dans des conditions de charge élevée, est une question qui préoccupe de nombreuses personnes. Cet article présentera

Linux est un système d'exploitation open source qui fournit une multitude d'outils de tests de réseau et de tests de résistance. Linux est donc un très bon choix pour effectuer des tests de réseau et des tests de résistance. Dans cet article, nous expliquerons comment utiliser Linux pour les tests réseau et les tests de résistance. 1. Tests de réseau Les tests de réseau sont le processus de test des performances du réseau, qui comprend généralement les tests suivants : Test de bande passante Lors des tests de bande passante du réseau, nous devons mesurer la vitesse de transmission des données sur le réseau. L'un des outils couramment utilisés est iperf, disponible sous Linux.

Les tests de résistance logiciels sont une activité d’assurance qualité de base qui fait partie de tout effort important de test de logiciels. Par conséquent, les tests de résistance sont très importants, alors comment effectuer des tests de résistance ? Dans cet article, je vais partager avec vous un outil de test de stress super pratique - l'outil ab (apache bench), j'espère qu'il vous sera utile !

PHP est un langage de script largement utilisé dans le développement Web. Il est utilisé pour développer de nombreux sites Web et applications à grande échelle. L'optimisation des performances et les tests de résistance sont très critiques lors du développement d'applications PHP, car cela vous aidera à garantir que l'application peut supporter des charges élevées de trafic utilisateur pendant le fonctionnement réel sans problèmes de performances ni effondrement du système. Cet article présente principalement certains outils de tests de résistance courants utilisés en PHP. ApacheBenchApacheBench(ab) est un outil de base

Comment utiliser MTR pour les tests de résistance des bases de données MySQL ? Présentation : MySQLTestRun (MTR) est un outil de test officiellement fourni par MySQL pour tester les fonctionnalités et les performances des bases de données MySQL. En plus des tests fonctionnels, MTR peut également être utilisé pour les tests de résistance des bases de données. Cet article explique comment utiliser MTR pour les tests de résistance des bases de données MySQL et fournit quelques exemples de code. Étape 1 : Installer MTR Tout d’abord, nous devons installer l’outil MTR. MTR est dans le code source MySQL

MTR : étapes des tests de résistance des bases de données à l'aide du cadre de test MySQL Introduction : Avec le développement rapide d'Internet, les tests de résistance des bases de données sont devenus de plus en plus importants. Les tests de résistance de la base de données sont conçus pour simuler la charge dans des conditions d'utilisation réelle et évaluer les performances et la stabilité de la base de données dans des conditions de concurrence élevée. Cet article explique comment utiliser le framework de test MySQL (MySQLTestRunner, MTR en abrégé) pour effectuer des tests de résistance de base de données et fournit des exemples de code correspondants. 1. Introduction à MTR MySQLTest

Comment effectuer des tests de performances et des tests de résistance dans le développement du langage Go. Avec le développement continu des applications Internet, les tests de performances et les tests de résistance sont devenus un élément indispensable du processus de développement logiciel. Dans le développement du langage Go, nous devons également effectuer des tests de performances et des tests de résistance pour garantir la stabilité et la fiabilité de l'application. Cet article explique comment effectuer des tests de performances et des tests de résistance dans le développement du langage Go. 1. Tests de performances Les tests de performances font référence à l'évaluation et au test des performances de charge du système par divers moyens, qui comprennent principalement les aspects suivants : Détermination de la progression des indicateurs de performance

Comment effectuer des tests de performances et des tests de résistance sur des projets de développement Java Avec le développement continu d'Internet, Java est devenu l'un des langages de développement les plus couramment utilisés. Lors de la conduite de projets de développement Java, les tests de performances et les tests de résistance sont des liens très importants. Grâce aux tests de performances et aux tests de contrainte, vous pouvez évaluer les performances du système sous des charges spécifiques, découvrir et résoudre des problèmes de performances potentiels et garantir que le système offre des performances et une disponibilité élevées. Cet article explique comment effectuer des tests de performances et des tests de résistance des projets de développement Java. 1. Test de performances Test de performances
