検索
ホームページデータベースmysql チュートリアルMySQLテーブル接続の実行プロセスは何ですか?

    1. はじめに

    接続操作では、駆動テーブルと被駆動テーブルの関連付け条件をその後に置きます。テーブルと駆動テーブルを追加しました。駆動テーブルのフィルター条件が on または where の後に配置された場合、エラーは報告されませんが、取得される結果セットは異なりますか? ? ?

    1.1 mysql 接続の原理

    ご存知のとおり、mysql は Nested-Loop Join (ネストループ結合、現時点では最適化アルゴリズムを考慮していません) に基づいています。 ) テーブル間の接続操作を実行するアルゴリズム 一般的なプロセスは次のとおりです。

    • ドライバー テーブルを選択し、ドライバー テーブルに関連するフィルター条件を使用して単一テーブルを実行します。ドライバー テーブルに対するクエリ;

    • クエリされたドライバー テーブル内の各レコードについて、駆動テーブル内の一致するレコードを検索します。

    疑似コードは次のとおりです。

    for each row in t1 {      // 遍历满足对t1单表查询结果集中的每一条纪录
        for each row in t2 {  // 对于某条t1纪录,遍历满足对t2单表查询结果集中的每一条纪录
            if row satisfies join conditions, send to client
        }
    }

    1.2 show warnings コマンド

    記述した SQL ステートメントは次のように最適化されます。その後、オプティマイザは実行のためにエグゼキュータに渡され、show warnings コマンドを使用すると、オプティマイザによって最適化された SQL を取得できます。

    2. 準備

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

    CREATE TABLE `student` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `stu_code` varchar(20) NOT NULL DEFAULT '',
      `stu_name` varchar(30) NOT NULL DEFAULT '',
      `stu_sex` varchar(10) NOT NULL DEFAULT '',
      `stu_age` int(10) NOT NULL DEFAULT '0',
      `stu_dept` varchar(30) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`) USING BTREE,
      UNIQUE KEY `uq_stu_code` (`stu_code`)
    ) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4
    
    CREATE TABLE `course` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `cou_code` varchar(20) NOT NULL DEFAULT '',
      `cou_name` varchar(50) NOT NULL DEFAULT '',
      `cou_score` int(10) NOT NULL DEFAULT '0',
      `stu_code` varchar(20) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`) USING BTREE,
      KEY `idx_stu_code_cou_code` (`stu_code`,`cou_code`)
    ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4

    テーブルのデータは次のとおりです:

    MySQLテーブル接続の実行プロセスは何ですか?

    3. inner join inner join on と where

    sql の違いは次のとおりです:

    select * from student
    inner join course on student.stu_code = course.stu_code
    and student.stu_code >= 3 and course.cou_score >= 80;

    explain sql コマンドを実行します:

    MySQLテーブル接続の実行プロセスは何ですか?

    show warnings コマンドを実行します:

    MySQLテーブル接続の実行プロセスは何ですか?

    分析: 表示警告の分析から、内部結合接続の場合、オプティマイザーによる最適化の後、on 接続条件は where! に変換されます。つまり、内部接続の where と on は と同等です。

    4. left join left join on と where

    4.1 のドライバー テーブル フィルター条件

    sql の違いは次のとおりです:

    select * from student
    left join course on student.stu_code = course.stu_code
    where student.stu_code >= 3;

    explain sql コマンドを実行します:

    MySQLテーブル接続の実行プロセスは何ですか?

    show warnings コマンドを実行します:

    MySQLテーブル接続の実行プロセスは何ですか?

    結果セット:

    MySQLテーブル接続の実行プロセスは何ですか?

    分析: Explain 分析から、student がドライバー テーブルとして使用されます、student.stu_code >= 3 は、テーブル全体のスキャンを実行するためのフィルター条件として使用され、その後、クエリされた各レコードの Student.stu_code (つまり、on 条件内) がフィルター条件として使用され、駆動テーブル コースでの単一テーブル クエリ。

    4.2 ドライバー テーブル フィルター条件の

    sql は次のとおりです:

    select * from student
    left join course on student.stu_code = course.stu_code 
    and student.stu_code >= 3;

    explain SQL コマンドを実行します:

    MySQLテーブル接続の実行プロセスは何ですか?

    show warnings コマンドを実行:

    MySQLテーブル接続の実行プロセスは何ですか?

    ## 結果セット:

    MySQLテーブル接続の実行プロセスは何ですか?

    結果セットから、student.stu_code >= 3 は有効になりません。なぜですか?

    分析: Explain 分析からわかるように、student はテーブル全体のスキャンを実行するドライバー テーブルとして使用され、その後、クエリされた各テーブルの Student.stu_code と Student.stu_code が使用されます。 Record are >= 3 (つまり、on 条件内) は、駆動テーブルが単一テーブル クエリを実行できるようにするフィルター条件として使用されます。現時点では、student.stu_code >= 3 はフィルターされません。ドライバー テーブルに接続する場合にのみ有効となり、クエリは一致するレコードを見つけることができず、NULL を返します。

    4.3 駆動テーブルのフィルター条件について

    sql は次のとおりです:

    select * from student
    left join course on student.stu_code = course.stu_code 
    and course.cou_score >= 80;

    explain SQL コマンドを実行します:

    MySQLテーブル接続の実行プロセスは何ですか?

    show warnings コマンドを実行:

    MySQLテーブル接続の実行プロセスは何ですか?

    ##結果セット:

    # ##################################

    分析: Explain 分析からわかるように、テーブル全体のスキャンを実行するための駆動テーブルとして Student が使用され、クエリされた各レコードの Student.stu_code と course.cou_score は次のようになります。 on 条件の = 80 (つまり、) は、駆動テーブルが単一テーブル クエリを実行できるようにするためのフィルター条件として使用されます。

    4.4 ここで、駆動テーブルのフィルター条件

    sqlは次のとおりです:

    MySQLテーブル接続の実行プロセスは何ですか?

    explain sql コマンドを実行します:

    MySQLテーブル接続の実行プロセスは何ですか?

    show warnings コマンドを実行します:

    MySQLテーブル接続の実行プロセスは何ですか?

    結果セット:

    MySQLテーブル接続の実行プロセスは何ですか?

    ショーの警告の分析からですか?左結合接続が内部結合接続になりますか?

    分析: show warnings 分析から、駆動テーブルの where にフィルター条件がある場合、左結合が無効になり、内部結合接続に最適化されることがわかります。したがって、 駆動テーブルのフィルター条件は、where の代わりに配置する必要があります。

    以上がMySQLテーブル接続の実行プロセスは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明
    この記事は亿速云で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
    图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

    本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

    mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

    在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

    mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

    mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

    mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

    方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

    mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

    转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

    MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

    本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

    带你把MySQL索引吃透了带你把MySQL索引吃透了Apr 22, 2022 am 11:48 AM

    本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

    mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

    在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

    See all articles

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

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

    ホットツール

    Safe Exam Browser

    Safe Exam Browser

    Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

    DVWA

    DVWA

    Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

    SublimeText3 英語版

    SublimeText3 英語版

    推奨: Win バージョン、コードプロンプトをサポート!

    EditPlus 中国語クラック版

    EditPlus 中国語クラック版

    サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

    SublimeText3 Linux 新バージョン

    SublimeText3 Linux 新バージョン

    SublimeText3 Linux 最新バージョン