UTFスピード、明らかですが、初心者にはほとんど知られていない

現在、ほぼすべての記事で、utfのみを使用する必要があると記載されています。これは、utfが現代的で普遍的であり、一般的に非常に有用だからです。 この事実を否定することなく、私は同時にスクリプトの速度を言う著者に当惑させ、仕事の速度のために++ iよりも++ iを書く方が良いという事実に訴えたいと思います。

だから驚き-utfでの作業はcp1251よりも遅くなります。 サイズが大きく、文字がバイト単位で「整列」されていないためです。 それはphp / mysqlについてです


実際、これには特にひどいものは何もありません。 コード内のジャムとは異なり、utfを使用してもそれほど遅くなることはありませんが、直線的に遅くなるため、ほとんどの場合、問題はスケーリングによって非常に簡単に解決されます。 顧客/雇用主からより強力なサーバーにお金を渡そうとしたことがないなら、これはあなたを安心させるはずです。

あなたが安心していない場合、以下はあなたに役立つかもしれないいくつかの数字です。
患者:非常に強力な空borne部隊ではなく、ノード上の唯一の部隊(あちこちにドラッグする方が簡単ですが、それは重要ではありません)、数百万行のいくつかのテーブル、ロシア語のテキスト、英語。 テストをリブートするたびに、サーバーには何もロードされなくなります。 テストは少なくとも3回実行され、平均は表に表示されます。

どんなデータUTF結果CP1251の結果cp1251の利点
MyISAM(テキスト、テキスト、int、int)***************
元のDBサイズ1.250 GB0.975 GB1.28回
マスタデータ706 Mb479 Mb1.47回
インデックスデータ544 Mb496 Mb1.09回
行の一部を削除するリクエスト16秒7秒2.28回
フルテキストインデックスの削除26秒23秒1.13回
フルテキストインデックスの構築6分22秒3分12秒1.98回
正確なエントリを検索、10回* 19.67秒1.92秒5.03回
ファイルへのmysqldumpエクスポート8.8秒4.9秒1.79回
ファイルからのmysqlインポート13.8秒8.7秒1.58回
* .sqlファイルサイズ773 Mb526 Mb1.46回
スフィンクスの索引付け103秒41秒2.51回
スフィンクスの基本サイズ680 Mb433 Mb1.57回
innoDB(テキスト、テキスト、整数、整数) * 3***************
元のDBサイズ925 Mb629 Mb1.47回
行の一部を削除するリクエスト21.2秒12秒1.76回
正確なエントリを10回検索33.47秒21.89秒1.52回
ファイルへのmysqldumpエクスポート23秒17秒1.35回
ファイルからのmysqlインポート* 48分24秒5分41秒1.47回
* .sqlファイルサイズ748 Mb510 Mb1.46回
メモリint、char(128) * 2***************
メモリテーブルサイズ515 Mb179 Mb2.87回
メモリテーブルの行の長さ3901332.93回
メモリテーブル1000回の検索、毎回見つかるもの1.9秒0.32秒5.93回
メモリテーブル1000検索、何も見つかりませんでした1.8秒0.28秒6.42回


* 1 :これらの数値にショックを受けて、同様のテストがローカルホストで開始され、利点は3.02倍に減少しました。 おそらく、何かがキャッシュに入れられなかったか、utfの場合に不必要にディスクに落ちたため、データが増えました。
* 2 :メモリテーブルは、正確な出現を検索するために使用されます。メモリテーブルには、純粋にロシア語のテキストといくつかのスペースが含まれています。 約200万行。 utf8のメモリテーブルのサイズは、cp1251の3倍です。 固定サイズが使用され(メモリには他の方法はありません)、その中のuft8は文字ごとに3バイトを予約します。
* 3 :innoDBの場合、フルテキストインデックスは、innoDBでサポートされていないためテストされていません。 InnoDBはMyISAMや他の空中システムとはわずかに異なるサイズのテーブルを使用したため、絶対的な結果を直接比較することはできません。
* 4 :innoDBへのインポートに多くの時間がかかった理由は非常に不明です。 MyISAMの場合、インポートとエクスポートの違いは最小限です。



そして、いくつかの一般的な言葉。 一般的に言えば、この「記事」は数年前にドラフト形式で作成されました。 ここにスフィンクスのみが追加され、テストが繰り返されました。 そして、utfの見通しについてのいくつかのフォーラムでの論争の結果として生じ、彼らは他のエンコーディングが1年で死ぬだろうと言っている。 しかし、彼らは死ななかった。
さらに、例えばphp / mysqlの問題はまだ非常に異なっています。 最初にutf、次にutf-8、次にutf8を記述する必要があります。 そして、utfでさえru_RU.UTFまたはen_EN.UTFのいずれかであり、これはiconv //で変な効果を与えます//トランジットを無視します//神はその理由を知っています。 phpをモジュールとしてインストールすると、サーバー全体でロケールが同じになり、すべての結果が得られます。正しいロケールでも、文字列を操作するために通常の関数を使用することはできません。この作業をサポートする類似物を使用する必要があります。 一般的に、utfは確かに高度な技術ですが、過度に熱狂的になることなく、思慮深く適用する必要があります。

PS:プロキシでトラフィックを圧縮したい人のために、utf8のHTMLファイルはgzipでも5-20%大きいことに注意してください

Source: https://habr.com/ru/post/J116822/


All Articles