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衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











コンテナーのパフォーマンス テストとストレス テストに Docker を使用する方法には、特定のコード サンプルが必要です。はじめにコンテナー仮想化テクノロジの台頭により、アプリケーションのデプロイメントと運用がより柔軟かつ効率的になりました。最も人気のあるツールの 1 つは Docker です。軽量のコンテナ化プラットフォームとして、Docker はアプリケーションをパッケージ化、配布、実行するための便利な方法を提供しますが、コンテナーのパフォーマンス、特に高負荷条件でのストレス テストをどのようにテストして評価するかは、多くの人が懸念している問題です。この記事で紹介するのは

ソフトウェア ストレス テストは、すべての重要なソフトウェア テスト作業の一部である基本的な品質保証活動です。したがって、ストレステストは非常に重要ですが、ストレステストをどのように行うか?今回は超実用的なストレステストツール「abツール(Apache bench)」を紹介しますので、お役に立てれば幸いです。

Linux は、豊富なネットワーク テストおよびストレス テスト ツールを提供するオープン ソース オペレーティング システムであるため、ネットワーク テストおよびストレス テストを実施する場合には Linux が非常に良い選択肢となります。この記事では、Linux をネットワーク テストとストレス テストに使用する方法について説明します。 1. ネットワーク テスト ネットワーク テストは、ネットワークのパフォーマンスをテストするプロセスで、通常は次のテストが含まれます。 帯域幅テスト ネットワーク帯域幅テストを実行する場合、ネットワーク内のデータの送信速度を測定する必要があります。一般的に使用されるツールの 1 つは、Linux で利用できる iperf です。

PHP は Web 開発で広く使用されているスクリプト言語であり、多くの大規模な Web サイトやアプリケーションの開発に使用されています。パフォーマンスの最適化とストレス テストは、PHP アプリケーションの開発中に非常に重要であり、これにより、アプリケーションが実際の運用中にパフォーマンスやシステムの問題なく高負荷のユーザー トラフィックに耐えられるようにすることができます。この記事では主に、PHP で使用される一般的なストレス テスト ツールをいくつか紹介します。 ApacheBenchApacheBench(ab) は基本的な

MySQL データベースのストレス テストに MTR を使用するにはどうすればよいですか?概要: MySQLTestRun (MTR) は、MySQL データベースの機能とパフォーマンスをテストするために MySQL によって公式に提供されるテスト ツールです。機能テストに加えて、MTR はデータベースのストレス テストにも使用できます。この記事では、MySQL データベースのストレス テストに MTR を使用する方法を紹介し、いくつかのコード例を示します。ステップ 1: MTR をインストールする まず、MTR ツールをインストールする必要があります。 MTR は MySQL ソース コード内にあります

MTR: MySQL テスト フレームワークを使用したデータベース ストレス テストの手順 はじめに: インターネットの急速な発展に伴い、データベース ストレス テストの重要性がますます高まっています。データベース ストレス テストは、実際の使用状況での負荷をシミュレートし、高い同時実行環境でのデータベースのパフォーマンスと安定性を評価するように設計されています。この記事では、MySQL テスト フレームワーク (MySQLTestRunner、略して MTR) を使用してデータベース ストレス テストを実施する方法を紹介し、対応するコード例を示します。 1. MTR MySQLTest の概要

Go 言語開発でパフォーマンス テストとストレス テストを実行する方法: インターネット アプリケーションの継続的な開発に伴い、パフォーマンス テストとストレス テストはソフトウェア開発プロセスの不可欠な部分になっています。 Go 言語の開発では、アプリケーションの安定性と信頼性を確保するためにパフォーマンス テストやストレス テストを実施する必要もあります。この記事では、Go言語開発におけるパフォーマンステストとストレステストの実施方法を紹介します。 1. パフォーマンス テスト パフォーマンス テストとは、さまざまな手段によるシステムの負荷パフォーマンスの評価とテストを指します。これには主に次の側面が含まれます。 パフォーマンス指標の進捗状況の確認

Java 開発プロジェクトでパフォーマンス テストとストレス テストを実行する方法 インターネットの継続的な発展に伴い、Java は最も一般的に使用される開発言語の 1 つになりました。 Java 開発プロジェクトを実施する場合、パフォーマンス テストとストレス テストは非常に重要なリンクです。パフォーマンス テストとストレス テストを通じて、特定の負荷の下でシステムのパフォーマンスを評価し、潜在的なパフォーマンスの問題を発見して解決し、システムが高いパフォーマンスと高可用性を備えていることを確認できます。この記事では、Java開発プロジェクトのパフォーマンステストとストレステストを実施する方法を紹介します。 1. 性能試験 性能試験
