MySQLステートメントの実行の問題を覚えておいてください

テーブルの構造は次のとおりです。


mysql> CREATE TABLE `table_a` (
  `id` int(11) NOT NULL,
  `b` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `b` (`b`)
) ENGINE=InnoDB;

現在、テーブルに100万行のデータがあり、100,000行のデータのbの値が「1234567890」であるとします。現在の実行ステートメントが次のように記述されているとします。


mysql> select * from table_a where b='1234567890abcd';

現時点では、MySQLはどのように実行されますか?

  • 理想的には、MySQLがフィールドbがvarchar(10)を定義していることを確認した場合、nullを返す必要があります。残念ながら、MySQLはこれを行いませんでした。
  • または、「1234567890abcd」をインデックスに取り込んで照合を行います。インデックスツリーbにそのような値がないことをすばやく判断できない場合は、すぐに空の結果が返されます。しかし実際には、MySQLはこれを行いません。

 

このSQLステートメントの実行は非常に遅く、フローは次のようになります。

  1. 実行のためにエンジンに渡されると、文字は切り捨てられます。エンジンのこの行は10の長さしか定義していないため、最初の10バイトのみが切り捨てられます。これは、照合のために入力される「1234567890」です。
  2. このように、条件を満たすデータは100,000行あります。
  3. select *であるため、100,000回テーブルに戻る必要があります。
  4. しかし、テーブルに戻って行全体を見つけ、サーバーレイヤーに移動して判断するたびに、bの値は「1234567890abcd」ではありません。
  5. 返される結果は空です。

 

 

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/m0_46405589/article/details/115264633