MySQL の int、char、varchar のパフォーマンスを比較する

MySQL の int、char、varchar のパフォーマンスを比較する

インターネットには、真実のように見える「噂」がたくさんあります。もちろん、悪意のあるものではありません。そのほとんどは、開発者が自ら率先して調査することを望まず、代わりに他の人の言うことを信じているためです。

データベースに関しては、「int のパフォーマンスは char よりもはるかに高い」といった噂も数多くあります。

最近、int、long、char、varchar のパフォーマンス テストを実施しましたが、実際にはそれらのパフォーマンスに大きな違いはないことがわかりました。

注: c8=char(8)、s8=varchar(8)、i8=(bigint)、c4=char(4)、s4=varchar(4)、i4=char(4)

インデックスなしで 100 万行をクエリします。

[c8 クエリ] を 20 回実行、平均時間消費 312.0 ミリ秒
[s8 クエリ] を 20 回実行、平均時間消費 334.3 ミリ秒
[i8 クエリ] を 20 回実行、平均時間消費 276.95 ミリ秒
[c4 クエリ] を 20 回実行、平均時間消費 354.95 ミリ秒
[s4 クエリ] を 20 回実行、平均時間消費 340.45 ミリ秒
[i4 クエリ] を 20 回実行すると、平均所要時間は 291.1 ミリ秒になります。

インデックスを作成します。

c8 インデックス作成に 2439 ミリ秒かかりました
s8 インデックス作成に 2442 ミリ秒かかりました
i8 インデックス作成に 1645 ミリ秒かかりました
c4 インデックス作成に 2296 ミリ秒かかりました
s4 インデックス作成に 2303 ミリ秒かかりました
i4 インデックス作成に 1403 ミリ秒かかりました

インデックス付きクエリ:

[c8 クエリ] を 10000 回実行、平均時間消費 0.271 ミリ秒
[s8 クエリ] を 10000 回実行、平均時間消費 0.2354 ミリ秒
[i8 クエリ] を 10000 回実行すると、平均時間は 0.2189 ミリ秒になります。
[c4 クエリ] を 10000 回実行、平均時間消費 0.303 ミリ秒
[s4 クエリ] を 10000 回実行、平均時間消費 0.3094 ミリ秒
[i4 クエリ] を 10000 回実行すると、平均所要時間は 0.25 ミリ秒になります。

結論は:

インデックスなし: データが小さくなるため、テーブル全体のスキャンは高速化されませんが、全体的な速度は同じで、ネイティブ型としての int/bigint はわずかに 12% 高速になります。

インデックス付き: char と varchar のパフォーマンスは同等ですが、int はわずかに 18% 高速です。

データの保存、読み取り、書き込みに関しては、整数は同じ長さの文字列と同じですが、varchar には余分なバイトがあるため、パフォーマンスがわずかに影響を受ける可能性があります (1/n)。

データ操作と比較に関しては、整数はネイティブ サポートの恩恵を受けるため、文字列よりもわずかに高速になります。

インデックスを使用すると、整数と文字列のパフォーマンスの違いはさらに小さくなります。

実際の開発では、多くの開発者がchar(1)やchar(4)などの文字列を使用して型列挙を表すことがよくあります。私の意見では、このアプローチは、ストレージスペース、コンピューティングパフォーマンス、可読性、保守性、スケーラビリティの点でintやenumなどのデータ型よりもはるかに優れているため、最適なソリューションです。

以下もご興味があるかもしれません:
  • MySQL CHARとVARCHARの選択方法
  • Mysql の varchar 型に関する注意点
  • MySQL CHARとVARCHARの保存と読み取りの違い
  • MYSQL における char と varchar の違い
  • MySQL の char、varchar、text フィールド タイプの違い
  • Mysql varchar型の合計操作例
  • MySQL で varchar の長さを動的に変更する方法
  • Mysqlでvarcharの長さを設定する方法
  • Mysql データベースで varchar 型を int 型に変換する方法
  • MySQLはvarchar型とnvarchar型の特殊文字をどのように処理しますか
  • 面接官がmysqlのcharとvarcharの違いを尋ねたとき

<<:  Linux のバックグラウンドで & と nohup を使用する方法

>>:  WeChatアプレットがスネークゲームを実装

推薦する

デザインにおいて無視できないインタラクティブデザインにおける製品状態の分析

製品デザインのプロセスにおいて、デザイナーは常に写真を非常に美しくすることを好みます。仮想ページのコ...

Ubuntu 18.04 のインストールで「ldlinux.c32 のロードに失敗しました」というエラーが表示され、解決手順がわかりません

序文私は Win7 を搭載した古いラップトップを持っています。古いシステムを維持しながら、同時に U...

CentOS 7 で RPM パッケージを使用して MySQL 5.7.9 をインストールするチュートリアル

MySQL 5.7.9 のインストールチュートリアルを録画してみんなと共有しましょう環境の紹介:オペ...

VMware 仮想マシンに固定 IP アドレスを設定する方法 (グラフィック チュートリアル)

1. メニューバーで「編集」→「仮想ネットワーク エディター」を選択して仮想ネットワーク エディタ...

MySQL 5.7.18 MSI インストール グラフィック チュートリアル

この記事では、参考までにMySQL 5.7.18 MSIインストールチュートリアルを紹介します。具体...

MySQL外部キーの基本的な機能と使用方法の詳細な説明

この記事では、例を使用して、MySQL 外部キーの基本的な機能と使用方法を説明します。ご参考までに、...

NodeJSのモジュール性に関する詳細な説明

目次1. はじめに2. 本文2.1 モジュールとは何ですか? 2.2 解決2.3、require.r...

mysql8でルートユーザーのパスワードをリセットする手順を完了します

序文最近、多くの新しい同僚がこの質問をしてきました。特に、homebrew を通じて自動的にインスト...

CSS設定div背景画像実装コード

コンポーネントに背景画像コントロールを追加するには、次の 2 つの手順だけが必要です。 <表示...

FileZilla を使用して FTP サーバーに接続するプロセスの図

最初にサーバー上に FTP サーバーをセットアップし始めたとき、接続できないことがわかったので、Fi...

カルーセル効果を作成するためのjs

カルーセルはフロントエンド開発において比較的重要なポイントだと思います。ネイティブjsの知識ポイント...

Docker での Redis の最も詳細なインストールと構成 (画像とテキスト付き)

1. Dockerに適したRedisのバージョンを見つけるdocker hubで見つけることができ...

JS で配列の重複排除を実装する 7 つの方法

目次1. Set()+Array.from() を使用する2. 2層ループ+アレイ接合方式の使用3....

ヘッダーのチェックボックスをテキスト実装コードに変更するための選択テーブルを持つ要素

方法1: テーブル属性を使用する: header-cell-class-name テーブルインターフ...

Dockerでイメージ情報を表示する方法

この記事では、Dockerでイメージ情報を表示する方法を学ぶ必要があります。 1. imagesコマ...